PDA

View Full Version : [JAVA] Lista di stringhe in una ScrollPane


Attila7894
31-08-2009, 02:53
Ciao a tutti :) Avrei bisogno di un piccolo aiuto. Ho un ScrollPane al centro del Frame. In questa ScrollPane dovrei stampare in ordine, dall'alto verso il basso, una lista di stringhe, una per riga. Deve apparire soltanto la barra verticale. Sapete come implementare una cosa simile? Non sò più dove sbattere la testa, non sò quale LayoutManager faccia al caso mio :mc:

Ah, e inoltre, una volta creato l'intero codice e tutte le classi, come faccio a rendere il package eseguibile, come fosse un normale applicativo?

PGI-Bis
31-08-2009, 09:25
Per l'eseguibile se usi Netbeans trovi un file .jar eseguibile nella cartella "dist" dopo un build o un clean and build o un salvataggio. Per eclipse c'è una funzione "export" da qualche parte che crea il jar exeguibile.

Per la lista di stringhe se vuoi usare un componente per ogni stringa (ad esempio una serie di JLabel) puoi usare una Box:

Box box = Box.createVerticalBox();
JScrollPane scroller = new JScrollPane(box);
scroller.setVerticalScrollbarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS)
scroller.setHorizontalScrollbarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
...
box.add(new JLabel("stringa 1"));
box.add(new JLabel("stringa 2"));
box.add(new JLabel("eccetera"));

//all'interfaccia aggiungi "scroller" che contiene box

Usare un componente per stringa può non essere conveniente dal punto di vista delle prestazioni (immagina di avere 1000 stringhe, ti trovi con 1000 componenti diversi da disegnare).

Puoi usare una JList che è praticamente la stessa cosa del box con le etichette:

DefaultListModel model = new DefaultListModel();
JList lista = new JList(model);
JScrollPane scroller = new JScrollPane(box);
scroller.setVerticalScrollbarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS)
scroller.setHorizontalScrollbarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
...
model.addElement("Stringa 1");
model.addElement("Stringa 2");
model.addElement("eccetera");

//all'interfaccia aggiungi scroller che contiene lista

L'opzione più "light" è l'area di testo non formattato:

JTextArea area = new JTextArea();
area.setEditable(false);
JScrollPane scroller = new JScrollPane(box);
scroller.setVerticalScrollbarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS)
scroller.setHorizontalScrollbarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
...
area.append("Stringa 1");
area.append("\n" + "Stringa 2");
area.append("\n" + "eccetera");

//all'interfaccia aggiungi sempre scroller che stavolta contiene area

Con l'area di testo tuttavia perdi la possibilità di decorare visivamente le singole stringhe salva l'applicazione di un particolare font per tutte.

A te la scelta.

Attila7894
31-08-2009, 20:38
Grazie mille per la risposta. Ho utilizzato la prima soluzione, però non riesco a risolvere un problema. In questo box io devo aggiungere o rimuovere JLabel secondo la pressione di due tasti. Quando aggiungo una JLabel tutto ok, ma quanto ne rimuovo una la grafica non viene aggiornata. Ho provato a richiamare validate() ma nulla. Quale metodo devo richiamare e di quale componente?

Grazie per l'attenzione :)

PGI-Bis
31-08-2009, 21:17
Ci vogliono Gasparre, Melchiorre e Baldassarre:

box.remove(x);
box.revalidate();
box.repaint();

Il primo rimuove, il secondo rigenera e il terzo da un ridisegnata "tanto per andare sul sicuro" :D.

Documentazione alla mano dovrebbe bastare Gasparre ma la javadoc a volte racconta certe panzane...