Sei sulla pagina 1di 9

Checkbox e radio button

In questa dispensa saranno presentati ulteriori componenti dell'interfaccia utente definiti nel package javax.swing. In particolare ci occuperemo di: caselle di controllo (JCheckBox); pulsanti di opzione (JRadioButton); gruppi di pulsanti di opzione (ButtonGroup). Prima di analizzare le funzionalit dei diversi componenti, vediamo come questi si collocano nella gerarchia delle classi di Java.
Obje ct

ButtonGroup

Com pone nt

Contain er

JCom p onent

Ab stractB utton

JT ogg leButto n

JCheckBox

JRadioButton

Caselle di controllo: la classe JCheckBox


Le caselle di controllo (JCheckBox) sono pulsanti di stato che permettono all'utente di esprimere una scelta di tipo vero/falso, si/no. Ogni casella di controllo ha uno stato che pu assumere valore: true, se la casella selezionata; false altrimenti. un'etichetta, che la identifica.
1 Bocchi Cinzia Ultimo aggiornamento: 25/10/2011

Una casella di controllo ha la forma di un piccolo quadrato, con un eventuale segno di spunta all'interno, qualora sia selezionata, come si pu vedere nella figura seguente.

Fig. 1 Frame con caselle di controllo

Per attivare una casella di controllo, l'utente pu utilizzare il mouse oppure la barra spaziatrice (quando la casella ha il focus).

Costruttori della classe JCheckBox


public JCheckBox () Crea una casella di controllo con stato false. public JCheckBox (String etichetta) Crea una casella di controllo con l'etichetta specificata e stato false. public JCheckBox (Icon icona) Crea una casella di controllo con l'icona specificata e stato false. public JCheckBox (String etichetta, boolean stato) Crea una casella di controllo con l'etichetta e lo stato specificati. public JCheckBox (Icon icona, boolean stato) Crea una casella di controllo con l'icona e lo stato specificati. public JCheckBox (String etichetta, Icon icona) Crea una casella di controllo con l'etichetta e l'icona specificati e stato false. public JCheckBox (String etichetta, Icon icona, boolean stato) Crea una casella di controllo con l'etichetta, l'icona e lo stato specificati.

Metodi utili ereditati dalla classe AbstractButton


public String getText () Restituisce l'etichetta della casella di controllo. public void setText (String etichetta) Imposta l'etichetta della casella di controllo al valore passato come parametro. public boolean isSelected ()
2 Bocchi Cinzia Ultimo aggiornamento: 25/10/2011

Restituisce lo stato della casella di controllo.

public void setSelected (boolean stato) Imposta lo stato della casella di controllo al valore specificato. public void doClick () Realizza un clic, cio ha lo stesso effetto di un clic eseguito dall'utente. public Icon getIcon () Restituisce l'icona della casella di controllo. public void setIcon (Icon icona) Imposta l'icona della casella di controllo al valore passato come parametro. public void setEnabled (boolean b) Abilita (se b true) o disabilita (se b false) la casella di controllo. Ridefinisce (override) il metodo setEnabled della classe JComponent.

public Object[] getSelectedObjects () Restituisce un array di oggetti, di dimensione 1, contenente: l'etichetta del pulsante, se esso selezionato; null altrimenti.

Eventi generati da una JCheckBox


Quando una checkbox viene selezionata, facendo clic su di essa, si genera sia un evento Item che un evento Action.

Esempio
Il seguente codice crea una GUI uguale a quella illustrata nella figura 1. Il frame contiene due pannelli: un pannello centrale che riporta la frase "Modifica lo stile del testo"; un pannello a sud, che contiene le due caselle di controllo. La stringa presente nel pannello centrale acquisisce lo stile impostato con le checkbox.
import import import import import import import import import import java.awt.BorderLayout; java.awt.Container; java.awt.Font; java.awt.event.ItemEvent; java.awt.event.ItemListener; javax.swing.JCheckBox; javax.swing.JFrame; javax.swing.JLabel; javax.swing.JPanel; javax.swing.SwingConstants;

public class UseCheckBoxFrame extends JFrame { private JPanel southPane = null; 3 Bocchi Cinzia Ultimo aggiornamento: 25/10/2011

private private private private

JPanel centerPane = null; JLabel label = null; JCheckBox bold = null; JCheckBox italic = null;

public UseCheckBoxFrame(){ super("CheckBox"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //creazione dei componenti southPane = new JPanel(); centerPane = new JPanel(); label = new JLabel("Modifica lo stile del testo"); label.setFont(new Font("Helvetica",Font.PLAIN,40)); //*******************checkbox****************** bold = new JCheckBox("BOLD"); italic = new JCheckBox("ITALIC"); //********************************************* //aggiunta dei componenti ai pannelli centerPane.add(label,SwingConstants.CENTER); southPane.add(bold); southPane.add(italic); //inserimento dei pannelli nel contentPane Container contentPane = getContentPane(); contentPane.add(centerPane, BorderLayout.CENTER); contentPane.add(southPane, BorderLayout.PAGE_END); //gestore dell'evento ItemListener listener = new ItemListener(){ public void itemStateChanged(ItemEvent e){ applyStyle(); } }; //registrazione del gestore di evento bold.addItemListener(listener); italic.addItemListener(listener); } public void applyStyle(){ if (bold.isSelected() && ! italic.isSelected()) label.setFont(new Font("Helvetica",Font.BOLD,40)); else if (bold.isSelected() && italic.isSelected()) label.setFont(new Font("Helvetica",Font.BOLD+Font.ITALIC,40)); else if (! bold.isSelected() && italic.isSelected()) label.setFont(new Font("Helvetica",Font.ITALIC,40)); else label.setFont(new Font("Helvetica",Font.PLAIN,40)); } public static void main(String[] args){ UseCheckBoxFrame frame = new UseCheckBoxFrame(); frame.pack(); frame.setVisible(true); } }

Si osservi che le due caselle di controllo sono associate allo stesso gestore.

4 Bocchi Cinzia Ultimo aggiornamento: 25/10/2011

Impostazione del font con la classe Font


Il metodo della classe JComponent public void setFont (Font font) permette di impostare il font del componente, ad un font specificato. Per creare un font si usa il costruttore della classe Font (del package java.awt) public Font (String nome, int stile, int dimensione) dove nome il nome del font, ad esempio Helvetica; stile lo stile applicato al font, ad esempio grassetto, corsivo, e cos via; dimensione la dimensione in punti del font. Per indicare lo stile si usano alcune costanti della classe Font: public static int BOLD per lo stile grassetto; public static int ITALIC per lo stile corsivo: public static int PLAIN per lo stile normale. Per esempio, l'istruzione label.setFont(new Font("Helvetica",Font.PLAIN,40)); presente nel costruttore del frame, crea un font di nome Helvetica, con stile piano e dimensione di 40 punti e applica tale font alloggetto label.

Pulsanti di opzione: la classe JRadioButton


I pulsanti di opzione (JRadioButton) sono caratterizzati da uno stato e hanno associata un'etichetta che li identifica, esattamente come le caselle di controllo; l'unica differenza visibile il diverso layout. Infatti, un pulsante di scelta ha la forma di un piccolo cerchio, con un eventuale pallino pieno all'interno, se selezionato. Normalmente i pulsanti di scelta vengono raggruppati. Quando pi pulsanti di scelta appartengono ad uno stesso gruppo, possibile selezionarne solo uno. La selezione di un pulsante di scelta determina la deselezione di ogni altro pulsante, appartenente allo stesso gruppo. Per esempio, se i pulsanti della figura precedente appartengono allo stesso gruppo, possibile selezionare un solo colore alla volta. Nel caso in cui l'utente decidesse di scegliere un colore diverso da BLU, il pulsante corrispondente sarebbe automaticamente deselezionato. Per creare un gruppo di pulsanti, si utilizza un oggetto della classe ButtonGroup. La procedura la seguente: 1. creare un oggetto della classe ButtonGroup; 2. aggiungere ogni pulsante di scelta al gruppo, cio all'oggetto della classe ButtonGroup; 3. aggiungere ogni pulsante di scelta ad un contenitore (contentPane o JPanel) se si desidera che anche graficamente i pulsanti siano raggruppati. Non si deve invece aggiungere l'oggetto della classe ButtonGroup al contenitore, poich esso non un componente GUI.
5 Bocchi Cinzia Ultimo aggiornamento: 25/10/2011

E' importante osservare che il raggruppamento di pi pulsanti di scelta avviene a livello logico ma non si riflette sul layout dei componenti. Per raggruppare visivamente i pulsanti, bisogna inserirli in un pannello.

Fig. 2 Frame con pulsanti di opzione

Costruttori della classe JRadioButton


public JRadioButton () Crea un pulsante di scelta con stato false. public JRadioButton (String etichetta) Crea un pulsante di scelta con l'etichetta specificata e stato false. public JRadioButton (Icon icona) Crea un pulsante di scelta con l'icona specificata e stato false. public JRadioButton (String etichetta, boolean stato) Crea un pulsante di scelta con l'etichetta e lo stato specificati. public JRadioButton (Icon icona,boolean stato) Crea un pulsante di scelta con l'icona e lo stato specificati. public JRadioButton (String etichetta, Icon icona) Crea un pulsante di scelta con l'etichetta e l'icona specificati e stato false. public JRadioButton (String etichetta, Icon icona,boolean stato) Crea un pulsante di scelta con l'etichetta, l'icona e lo stato specificati.

Metodi utili ereditati dalla classe AbstractButton


Sono gli stessi visti per le caselle di controllo.

6 Bocchi Cinzia Ultimo aggiornamento: 25/10/2011

Metodi utili della classe ButtonGroup


public ButtonGroup () Crea un gruppo per pulsanti di scelta. public void add (AbstractButton b) Aggiunge il pulsante b al gruppo. public void remove (AbstractButton b) Rimuove il pulsante b dal gruppo. public int getButtonCount () Restituisce il numero di pulsanti presenti nel gruppo.

Utilizzo di bordi: la classe BorderFactory


Per evidenziare visivamente lappartenenza di pulsanti radio ad un gruppo si pu ricorrere alluso di bordi. Un bordo pu essere applicato a qualsiasi componente che deriva da JComponent. La classe BorderFactory definisce un insieme di metodi static che consentono di creare molteplici tipi di bordi. In questo ambito vedremo come costruire un bordo inciso (etched) dotato di titolo. Per approfondire vi suggerisco di consultare le API Java e il tutorial. (url: http://download.oracle.com/javase/tutorial/uiswing/components/border.html) La creazione del bordo avviene con listruzione: Border border = BorderFactory.createEtchedBorder(); Il titolo viene aggiunto con listruzione: Border titledBorder = BorderFactory.createTitledBorder(border, titolo); Il bordo titledBorder deve poi essere aggiunto al componente con il metodo della classe JComponent, setBorder: component.setBorder(titledBorder); Il titolo ha allineamento orizzontale a sinistra (left) e verticale in alto (top) per default. Il colore e il font usati sono anchessi quelli di default. E possibile utilizzare una versione pi complessa del metodo createTitledBorder che consente di impostare i parametri prima specificati. Per esempio, per creare un titolo con allineamento orizzontale centrato, colore blu e font arial si deve scrivere: Border titledBorder = BorderFactory.createTitledBorder(border, titolo, TitledBorder.CENTER, TitledBorder.DEFAULT_POSITION font, color); dove font una istanza di Font e color una istanza di Color.
7 Bocchi Cinzia Ultimo aggiornamento: 25/10/2011

Eventi generati da un JRadioButton


Quando un pulsante di opzione viene selezionato, facendo clic su di esso, si genera sia un evento Item che un evento Action.

Esempio
Il seguente codice crea una GUI uguale a quella illustrata nella figura 2. Il frame contiene due pannelli: un pannello centrale colorato; un pannello a sud, che contiene tre pulsanti di opzione. Il pannello centrale acquisisce il colore selezionato. Se nessun radio button selezionato, lo sfondo bianco. Il pannello a sud ha un bordo inciso con titolo che racchiude i pulsanti.
import import import import import import import import import import import import java.awt.BorderLayout; java.awt.Color; java.awt.Container; java.awt.event.ItemEvent; java.awt.event.ItemListener; javax.swing.BorderFactory; javax.swing.ButtonGroup; javax.swing.JFrame; javax.swing.JPanel; javax.swing.JRadioButton; javax.swing.border.Border; javax.swing.border.TitledBorder;

public class UseRadioButtonFrame extends JFrame { private private private private private JPanel southPane = null; JPanel centerPane = null; JRadioButton blue = null; JRadioButton red = null; JRadioButton green = null;

public UseRadioButtonFrame(){ super("RadioButton"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //creazione dei componenti southPane = new JPanel(); centerPane = new JPanel(); centerPane.setBackground(Color.WHITE); //*******************radio button****************** blue = new JRadioButton("BLUE"); red = new JRadioButton("RED"); green = new JRadioButton("GREEN"); //********************************************* //gestione dell'evento di selezione blue.addItemListener(new ItemListener(){ public void itemStateChanged(ItemEvent e){ centerPane.setBackground(Color.BLUE); } }); 8 Bocchi Cinzia Ultimo aggiornamento: 25/10/2011

red.addItemListener(new ItemListener(){ public void itemStateChanged(ItemEvent e){ centerPane.setBackground(Color.RED); } }); green.addItemListener(new ItemListener(){ public void itemStateChanged(ItemEvent e){ centerPane.setBackground(Color.GREEN); } }); //inserimento dei pulsanti in un gruppo ButtonGroup group = new ButtonGroup(); group.add(blue); group.add(red); group.add(green); //aggiunta dei componenti ai pannelli southPane.add(blue); southPane.add(red); southPane.add(green); //inserimento del bordo Border border = BorderFactory.createEtchedBorder(); Border titledBorder = BorderFactory.createTitledBorder(border, "Colori", TitledBorder.CENTER, TitledBorder.DEFAULT_POSITION); southPane.setBorder(titledBorder); //inserimento dei pannelli nel contentPane Container contentPane = getContentPane(); contentPane.add(centerPane, BorderLayout.CENTER); contentPane.add(southPane, BorderLayout.PAGE_END); } public static void main(String[] args){ UseRadioButtonFrame frame = new UseRadioButtonFrame(); frame.pack(); frame.setVisible(true); }

Quest'opera stata rilasciata con licenza Creative Commons Attribution-ShareAlike 3.0 Unported. Per leggere una copia della licenza visita il sito web http://creativecommons.org/licenses/by-sa/3.0/ o spedisci una lettera a Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA. 9 Bocchi Cinzia Ultimo aggiornamento: 25/10/2011