## Cómo utilizar Checkboxes

La versión Swing soporta checkboxes con las clases JCheckbox y ButtonGroup. Como JCheckbox desceicende de AbstractButton, los checkboxes de Swing tienen todas las caracteristicas normales de los botones, como se explica en la página anterior. Por ejemplo, se pueden especificar imágenes para utilizarlas en los checkboxes.

Aquí tienes una imagen de una aplicación que tiene dos checkboxes:

> Intenta esto:
> 1. Compila y ejecuta la aplicación. El fichero fuente está en CheckboxDemo.java.
>    Puedes ver la página Empezando con Swing si necesitas ayuda.
> 2. Pulsa el botón 2.
>    El botón 2 se selecciona y el botón 1 permanece selecionado.
> 3. Mira el mesaje mostrado en la salida estándard.
>    Esta aplicación registra un oyente para cada tipo de evento que un botón puede enviar. Cada vez que recibe un evento, la aplicación muestra un mensaje que describe el evento.
> 4. Pulsa de nuevo el botón 2, y mira los mensajes mostrados en la salida estándard.

Un checkbox genera un evento de ítem y un evento de acción por cada pulsación,. Normalmente, lo único que necesita un manejador de eventos de checkboxes es un oyente de ítem. Si tu prefieres utilizar el API asociado con los eventos acción, puedes utilizar un oyente de acción en su lugar. No se necesita implementar un oyente de cambio a menos que tu programa necesite saber en todo momento los cambios de apariencia del botón.

Abajo tienes el códio de CheckboxDemo.java que crea loa checkboxes del ejemplo anterior y reacciona a los cliks.

>     //en el código de inicialización:
>         // Crear los botones.
>         JCheckbox firstButton = new JCheckbox(first);
>         firstButton.setKeyAccelerator('1');
>         firstButton.setActionCommand(first);
>         firstButton.setSelected(true);

>         JCheckbox secondButton = new JCheckbox(second);
>         secondButton.setKeyAccelerator('2');
>         secondButton.setActionCommand(second);

>         // Registra un oyente para los checkboxes.
>         CheckboxListener myListener = new CheckboxListener();
>         firstButton.addActionListener(myListener);
>         firstButton.addChangeListener(myListener);
>         firstButton.addItemListener(myListener);
>         secondButton.addActionListener(myListener);
>         secondButton.addChangeListener(myListener);
>         secondButton.addItemListener(myListener);
>     . . .
>     class CheckboxListener implements ItemListener, 	//Sólo es necesario el tipo
>     			       ActionListener, 		//sólo por curiosidad
>     			       ChangeListener {  	//sólo por curiosidad
>         public void itemStateChanged(ItemEvent e) {
>             System.out.println("ItemEvent received: "
>         		           + e.getItem()
>         		           + " is now "
>         		           + ((e.getStateChange() == ItemEvent.SELECTED)?
>         			      "selected.":"unselected"));
>         }

>         public void actionPerformed(ActionEvent e) {
>             String factoryName = null;

>             System.out.print("ActionEvent received: ");
>             if (e.getActionCommand() == first) {
>         	    System.out.println(first + " pressed.");
>             } else {
>         	    System.out.println(second + " pressed.");
>             }
>         }

>         public void stateChanged(ChangeEvent e) {
>             System.out.println("ChangeEvent received from: "
>         		           + e.getSource());
>         }
>     }

Puedes ver la página How to Use Buttons para más información sobre el API de AbstractButton del que desciende JCheckbox. El único API definido por JCheckbox que te gustará utilizar son los constructores. JCheckbox define siete constructores:

- JCheckbox(String)
- JCheckbox(String, boolean)
- JCheckbox(Icon)
- JCheckbox(Icon, boolean)
- JCheckbox(String, Icon)
- JCheckbox(String, Icon, boolean)
- JCheckbox()

Los argumentos son correctos:

String
  Especifica el texto que debería mostrar el checkbox.
Icon
  Especifica la imagen que debería mostrar el checkbox. A menos que se especifique una imagen se utilizan las imágenes definidas por la máquina virtual.
boolean
  Especifica si el checkbox está seleccionado. Por defecto es false [no seleccionado].

Ozito