Le JComboBox e le liste di oggetti

 Articolo letto 4207 volte 

Ed ecco un articolo molto simile al precedente, stavolta useremo una JComboBox e personalizzeremo gli elementi visualizzati con un’icona.

Consiglio, nuovamente, l’utilizzo di Netbeans1, che vi facilita il lavoro e permette di provare, senza modifiche, il progetto allegato.

Creazione della sorgente dati

Creiamo un oggetto Frutta con quattro attributi nome, id, bgColor, immagine i primi due sono autoesplicativi mentre bgColor servirà a memorizzare il colore di sfondo e immagine conterrà il riferimento all’icona dell’oggetto. Sono stati creati i metodi getter e setter oltre al toString che restituisce il nome dell’oggetto.

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
package combotest;
 
import java.awt.Color;
import javax.swing.ImageIcon;
 
public class Frutta {
    private String nome;
    private int id;
    private Color bgColor;
    private ImageIcon immagine;
 
    public Frutta(String nome, int id, Color bgColor, ImageIcon immagine) {
        this.nome = nome;
        this.id = id;
        this.bgColor = bgColor;
        this.immagine = immagine;
    }
 
    public Color getBgColor() {
        return bgColor;
    }
 
    public int getId() {
        return id;
    }
 
    public ImageIcon getImmagine() {
        return immagine;
    }
 
    public String getNome() {
        return nome;
    }
 
    @Override
    public String toString() {
        return nome;
    }
}

Anche in questo caso avremo una classe Loader per caricare la lista di oggetti Frutta. Da notare che le icone sono state incorporate nel progetto stesso e vengono caricate tramite il metodo getResource a cui viene passato il percorso relativo corrispondente al package name che contiene le immagini.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package combotest;
 
import java.awt.Color;
import java.util.ArrayList;
import javax.swing.ImageIcon;
 
public class Loader {
    public static ArrayList load() {
        Frutta pera = new Frutta("Pera", 1, Color.yellow, new ImageIcon(Loader.class.getResource("/combotest/image/pera.png")));
        Frutta pesca = new Frutta("Pesca", 2, Color.pink, new ImageIcon(Loader.class.getResource("/combotest/image/pesca.png")));
        Frutta mela = new Frutta("Mela", 3, Color.red, new ImageIcon(Loader.class.getResource("/combotest/image/mela.png")));
        Frutta arancia = new Frutta("Arancia", 4, Color.orange, new ImageIcon(Loader.class.getResource("/combotest/image/arancia.png")));
        ArrayList arrayList = new ArrayList();
        arrayList.add(mela);
        arrayList.add(pesca);
        arrayList.add(pera);
        arrayList.add(arancia);
        return arrayList;
    }    
}

Popolare la JList con una lista di Persone

Creiamo quindi su Netbeans un nuovo JFrame Form ed inseriamo una JComboBox, cambiandone il nome in ComboFrutta. Inseriamo il codice seguente nel costruttore della JFrame dopo initComponents. Carichiamo in load la nostra lista di oggetti, creiamo il modello dati per la lista DefaultComboModel model passando la lista load opportunamente convertita in Array. Infine assegniamo il modello alla JComboBox ed avviamo il progetto.

1
2
3
ArrayList load = Loader.load();
        DefaultComboBoxModel model = new DefaultComboBoxModel(load.toArray());
        ComboFrutta.setModel(model);

JComboBox popolata

 Gestire l’oggetto selezionato nella JList

Per gestire la selezione di uno degli elementi della JComboBox, inseriamo nella JFrame Form una JLabel. Rinominiamola in LabelScelta e dall’editor grafico di NetBeans selezioniamo Events > ItemState ItemStateChanged per definire il comportamento alla selezione di un elemento. Inseriamo quindi il codice ed avviamo nuovamente il progetto

1
2
3
4
if (evt.getItem() instanceof Frutta) {
            Frutta f = (Frutta)evt.getItem();
            LabelScelta.setText("ID:" + f.getId()+ " Nome: "+f.getNome());
        }

Selezione Elemento JComboBox

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 JComboBox nell’interfaccia utente. Come anticipato, si vuole colorare lo sfondo e visualizzare un’immagine in base al frutto scelto. E’ stata implementata la classe FruttaRenderer (all’interno della classe della JFrame Form) che estende BasicComboBoxRenderer. Di questa viene utilizzato il costruttore che restituisce il Component comp a cui verrà assegnato il colore di sfondo e l’icona. Infine, viene restituito dal metodo il component opportunamente personalizzato.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class FruttaRenderer extends BasicComboBoxRenderer {
    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        Component comp = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
        if (value instanceof Frutta) {
            if (comp instanceof JLabel) {
                JLabel jl = (JLabel)comp;
                jl.setBackground(((Frutta)value).getBgColor());
                jl.setIcon(((Frutta)value).getImmagine());
            }
        }
        return comp;
    }
}

Per provare la modifica occorre installare il Renderer sulla JComboBox, tramite una chiamata nel costruttore della JFrame Form, dopo initComponents() al metodo ComboFrutta.setRenderer(new FruttaRenderer());

Personalizzazione Visualizzazione JComboBox

Scarica il progetto completo 

  JComboBox Test (29,7 KiB, 335 hits)

 Articolo letto 4207 volte 

  1. un IDE per lo sviluppo di applicazioni http://netbeans.org/ []