Check box e lista swing

Da Head First Java O'Reilly, capitolo 13.

Un paio di utili widget sono il check box e la lista. Vediamo un piccolo esempio che li usa entrambi.

Lo scopo é quello di costruire una lista che permetta una selezione singola o multipla a seconda se il check box é spuntato o meno.

Vediamo subito il codice risultante:

import java.awt.BorderLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class MyList implements ItemListener, ListSelectionListener {

private JCheckBox cb;
private JList list;

public MyList() {
JFrame f = new JFrame();

addCheckBox(f);
addList(f);

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(150, 220);
f.setVisible(true);
}

private void addCheckBox(JFrame f) {
cb = new JCheckBox("Multiple selection");
cb.setSelected(true);
cb.addItemListener(this);
f.add(BorderLayout.NORTH, cb);
}

private void addList(JFrame f) {
String[] items = {"alpha", "beta", "gamma", "delta", "epsilon"};
list = new JList(items);
list.addListSelectionListener(this);

JScrollPane sp = new JScrollPane(list);
sp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
sp.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

f.add(BorderLayout.SOUTH, sp);
}

public void itemStateChanged(ItemEvent e) {
list.clearSelection();
if(cb.isSelected())
list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
else
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

System.out.println("Multiple selection is " +
(cb.isSelected() ? "on" : "off"));
}

public void valueChanged(ListSelectionEvent e) {
if(e.getValueIsAdjusting() == false) {
if(list.getSelectionMode() == ListSelectionModel.SINGLE_SELECTION) {
String item = (String) list.getSelectedValue();
if(item != null)
System.out.println("Selected item: " + item);
}
else {
Object[] items = list.getSelectedValues();
if(items.length > 0) {
System.out.print("Selected items:");
for(Object item : items) {
System.out.print(" " + item);
}
System.out.println();
}
}
}
}

public static void main(String[] args) {
new MyList();
}
}

Notiamo subito che la classe implementa i listener per eventi generati dalla check box (ItemListener) e dalla lista (ListSelectionListener). E dunque implementa i metodi itemStateChanged(), invocato quando lo stato della checkbox cambia, e valueChanged(), per un cambiamento nelle voci selezionate nella lista.

Ho scritto un paio di metodi privati alla classe che si occupano di istanziare le due widget. Con addCheckBox() creiamo la checkbox; la inizializziamo spuntata, con setSelected(true); registriamo la nostra classe per essere un listener della checkbox; e infine la aggiungiamo alla nostra frame.

Con addList() creiamo una lista di stringhe, che utilizziamo per creare la nostra JList su cui registriamo come listener la nostra classe e la aggiungiamo alla nostra frame.

La itemStateChanged() per prima cosa cancella tutte le eventuali selezioni (l'idea é che cambiando il modo di selezionare il lavoro precedente perde significato), poi modifica la modalità in cui lavora la lista a seconda del valore della checkbox.

La valueChanged() controlla lo stato dell'evento in ingresso per mezzo del suo metodo getValueIsAdjusting(), dato che se siamo nel mezzo di un cambiamento della selezione non dobbiamo fare alcun controllo aggiuntivo. Aspettiamo piuttosto che il cambiamento sia completato.

Controlliamo poi la modalità di selezione della lista. Se é in modalità di selezione singola, leggiamo la selezione con getSelectedValue(), se ritorna null vuol dire che non c'é alcuna selezione attiva, altrimenti scriviamo a consolle il valore della selezione.

In caso di modalità di selezione multipla reperiamo l'elenco di selezioni con getSelectedValues(), che torna un array di oggetti. Se c'é almeno una selezione (la length dell'array non é zero) le scriviamo a consolle.

Nessun commento:

Posta un commento