Popolare una JList con una collezione di oggetti

 Articolo letto 4496 volte 

In questo tutorial spiegherò come è possibile associare ad una JList una collezione di oggetti e personalizzarne la visualizzazione all’interno della lista.Per il tutorial è fortemente consigliato l’utilizzo di Netbeans1, che permette una rapida stesura del codice e facilita la creazione dell’interfaccia grafica.

Creazione della sorgente dati

Per cominciare occorre creare un oggetto: nell’esempio qui riportato abbiamo la classe Persona con 5 attributi (nome,cognome,sesso,telefono,codice fiscale). Il sesso è un enum che ammette i valori maschio e femmina. Oltre ai metodi getter e setter, ho creato due costruttori ed effettuato l’override del metodo toString. Quest’ultimo determina la rappresentazione testuale dell’oggetto Persona all’interno della JList. La classe è molto semplice per cui riporto di seguito il codice

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package listaesempio;
 
public class Persona {
    public enum Sesso { Maschio, Femmina };
    private String nome;
    private String cognome;
    private String telefono;
    private String codFiscale;
    private Sesso sesso;
 
    public Persona(String nome, String cognome, Sesso sesso, String codFiscale) {
        this.nome = nome;
        this.cognome = cognome;
        this.sesso = sesso;
        this.codFiscale = codFiscale;
    }
 
    public Persona(String nome, String cognome, String telefono, String codFiscale, Sesso sesso) {
        this.nome = nome;
        this.cognome = cognome;
        this.telefono = telefono;
        this.codFiscale = codFiscale;
        this.sesso = sesso;
    }    
 
    public String getCodFiscale() {
        return codFiscale;
    }
 
    public void setCodFiscale(String codFiscale) {
        this.codFiscale = codFiscale;
    }
 
    public String getCognome() {
        return cognome;
    }
 
    public void setCognome(String cognome) {
        this.cognome = cognome;
    }
 
    public int getEta() {
        return 0;
    }
 
    public String getNome() {
        return nome;
    }
 
    public void setNome(String nome) {
        this.nome = nome;
    }
 
    public Sesso getSesso() {
        return sesso;
    }
 
    public void setSesso(Sesso sesso) {
        this.sesso = sesso;
    }
 
    public String getTelefono() {
        return telefono;
    }
 
    public void setTelefono(String telefono) {
        this.telefono = telefono;
    }
 
    @Override
    public String toString() {
        return nome + " " + cognome;
    }
}

Un’altra classe chiamata Loader permette di ‘caricare’ una lista di oggetti Persona che, nel caso specifico, verranno on the fly. In una applicazione reale, il metodo potrebbe caricare gli oggetti da un database, da un sito web o da un file.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package listaesempio;
 
import java.util.ArrayList;
 
public class Loader {
    public static ArrayList loadPersone() {
        ArrayList arrayList = new ArrayList();
        Persona p1 = new Persona("mario", "rossi", "000-123456", "aaabbb80n21c123e", Persona.Sesso.Maschio);
        Persona p2 = new Persona("maria", "rossa", "000-2753216", "cccddd1231291203", Persona.Sesso.Femmina);
        Persona p3 = new Persona("giovanni", "bianchi", "000-1730193", "cdsadfaha fasddfs",Persona.Sesso.Maschio);
        Persona p4 = new Persona("olivia", "newton", "000-143426", "asfasddfasddfare", Persona.Sesso.Femmina);
        arrayList.add(p1);
        arrayList.add(p2);
        arrayList.add(p3);
        arrayList.add(p4);
        return arrayList;
    }    
}

Popolare la JList con una lista di Persone

Creiamo quindi su Netbeans un nuovo JFrame Form ed inseriamo una JList, cambiandone il nome in ListaPersone. Inseriamo il metodo fillList() che riempirà la JList con una serie di oggetti Persona. Dopo aver caricato in loadPersone la nostra lista di oggetti, creiamo il modello dati per la lista DefaultListModel lm ciclando l’ArrayList ed aggiungendo gli oggetti all’interno del modello. Infine assegniamo il modello alla nostra JList.

1
2
3
4
5
6
7
private void fillList() {
        ArrayList loadPersone = Loader.loadPersone();
        DefaultListModel lm = new DefaultListModel();
        for (Persona p : loadPersone)
            lm.addElement(p);
        ListaPersone.setModel(lm);
    }

Per far funzionare il tutto, inseriamo una chiamata a fillList nel costruttore del JFrame Form subito dopo la chiamata a initComponents(). Avviando il progetto vedremo la JList popolata con i nostri oggetti.

JList - Lista Oggetti

Personalizzare la visualizzazione degli oggetti

Per personalizzare la visualizzazione degli oggetti, occorre creare una propria implementazione di un ListCellRenderer che definisce la rappresentazione grafica degli elementi della JList nell’interfaccia utente. In questo caso, si è scelto di colorare lo sfondo della cella di rosa o d’azzurro in base al sesso. E’ stata implementata la classe ColoraCelleRenderer (all’interno della classe della JFrame Form) che estende l’implementazione di default del ListCellRenderer ovvero DefaultistCellRenderer di cui viene utilizzato il costruttore che restituisce il Component listCellRendererComponent. Quando l’elemento non è selezionato (si vuole preservare il colore di selezione), se ne personalizza il colore di background. Ciò viene deciso in base al sesso dell’oggetto Persona contenuto in value ed a cui viene applicato opportuno casting2. Infine, viene restituito dal metodo il component opportunamente personalizzato.

1
2
3
4
5
6
7
8
9
10
11
12
13
class ColoraCelleRenderer extends DefaultListCellRenderer {
    @Override
    public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        Component listCellRendererComponent = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
        if (!isSelected)
        if (value instanceof Persona) {
            Persona p = (Persona)value;
            if (p.getSesso().equals(Persona.Sesso.Maschio)) listCellRendererComponent.setBackground(Color.cyan);
            else listCellRendererComponent.setBackground(Color.PINK);
        }
        return listCellRendererComponent;
    }
}

Per provare la modifica occorre installare il Renderer sulla JList, tramite una chiamata nel costruttore della JFrame Form, dopo initComponents() e prima di fillList();.

jlist2

 Gestire l’oggetto selezionato nella JList

Per visualizzare informazioni dettagliate alla selezione di uno degli elementi della JList, inseriamo nella JFrame Form cinque JLabel. Rinominiamole rispettivamente in LabelCodFiscale, LabelCognome, LabelNome, LabelSesso e LabelTelefono. Sempre nella classe della JFrame, inseriamo il metodo fillInfoPersona, metodo che cambia il testo delle JLabel in base all’oggetto persona passato come argomento.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void fillInfoPersona(Persona p) {
        if (p==null) {
            LabelCodFiscale.setText("Codice Fiscale: n/d");
            LabelCognome.setText("Cognome: n/d");
            LabelNome.setText("Nome: n/d");
            LabelSesso.setText("Sesso: n/d");
            LabelTelefono.setText("Telefono: n/d");
        }
        else {
            LabelCodFiscale.setText("Codice Fiscale: "+p.getCodFiscale());
            LabelCognome.setText("Cognome: "+p.getCognome());
            LabelNome.setText("Nome: "+p.getNome());
            LabelSesso.setText("Sesso: "+p.getSesso());
            LabelTelefono.setText("Telefono: "+p.getTelefono());
        }
    }

Per concludere, clic destro sulla JList e selezioniamo Events > ListSelection > valueChanged  per definire il comportamento della JList quando viene selezionato un elemento. Inseriamo quindi il codice

1
2
Persona p = (Persona)ListaPersone.getSelectedValue();
        fillInfoPersona(p);

Ed ecco il risultato finale.

JList - Risultato Finale

Scarica il progetto completo 

  ListaEsempio.rar (15,0 KiB, 298 hits)

 Articolo letto 4496 volte 

  1. un IDE per lo sviluppo di applicazioni http://netbeans.org/ []
  2. http://it.wikipedia.org/wiki/Casting_(programmazione) []