## Cómo usar la clase CheckBox

La versión Swing soporta botones checkbox con la clase JCheckBox. Swing también soporta checkboxes en menus, utilizando la clase JCheckBoxMenuItem. Como JCheckBox y JCheckBoxMenuItem descienden de AbstractButton, los checkboxes de Swing tienen todas las características de un botón normal como se explicó en Cómo usar Buttons. Por ejemplo, podemos especificar imágenes para ser utilizadas en los checkboxes.

Los Checkboxes son similares a los botones de rádio, pero su modelo de selección es diferente, por convención. Cualquier número de checkboxes en un grupo -- ninguno, alguno o todos -- pueden ser seleccionados. Por otro lado, en un grupo de botones de rádio, sólo puede haber uno seleccionado.

> Nota: En Swing 1.0.2, los botones ignoran sus mnemónicos (teclas aceleradoras). Este bug se corrigió en Swing 1.0.3.

Aquí podemos ver una imagen de una aplicación que utiliza cuatro checkboxes para personalizar una caricatura:

> Intenta esto:
> 1. Compila y ejecuta la aplicación. El fichero fuente es CheckBoxDemo.java. También necesitarás los 16 ficheros de imagenes del directorio example-swing/images que empiezan con "geek".
> 2. Pulsa el botón Chin o pulsa Alt-C.
>    El checkbox Chin se desactiva, y la barbilla desaparecerá de la imagen. Los otros Checkboxes permanencen seleccionados. Esta aplicación tiene un oyente de ítem que escucha todos los checkboxes. Cada vez que el oyente de ítem recibe un evento, la aplicación carga una nueva imagen y refleja el estado actual de los checkboxes.

Un Checkbox genera un evento ítem y un evento action por cada pulsación. Normalmente, solo escucharemos los eventos de ítem, ya que nos permiten determinar si el click selecciona o desactiva el checkbox. Abajo puedes ver el código de CheckBoxDemo.java que crea los checkboxes del ejemplo anterior y reacciona ante las pulsaciones.

    //In initialization code:
        chinButton = new JCheckBox("Chin");
        chinButton.setMnemonic('c');
        chinButton.setSelected(true);

        glassesButton = new JCheckBox("Glasses");
        glassesButton.setMnemonic('g');
        glassesButton.setSelected(true);

        hairButton = new JCheckBox("Hair");
        hairButton.setMnemonic('h');
        hairButton.setSelected(true);

        teethButton = new JCheckBox("Teeth");
        teethButton.setMnemonic('t');
        teethButton.setSelected(true);

        // Register a listener for the check boxes.
        CheckBoxListener myListener = new CheckBoxListener();
        chinButton.addItemListener(myListener);
        glassesButton.addItemListener(myListener);
        hairButton.addItemListener(myListener);
        teethButton.addItemListener(myListener);
    ...
    class CheckBoxListener implements ItemListener {
        public void itemStateChanged(ItemEvent e) {
            ...
    	Object source = e.getItemSelectable();

            if (source == chinButton) {
                //...make a note of it...
            } else if (source == glassesButton) {
                //...make a note of it...
            } else if (source == hairButton) {
                //...make a note of it...
            } else if (source == teethButton) {
                //...make a note of it...
            }

            if (e.getStateChange() == ItemEvent.DESELECTED)
                //...make a note of it...
            picture.setIcon(/* new icon */);
            ...
        }
    }

#### El API CheckBox

> Puedes ver El API Button para información sobre el API de AbstractButton del que descienden JCheckBox y JCheckBoxMenuItem. Los métodos de AbstractButton que son más usados son setMnemonic, addItemListener, setSelected, y isSelected. El único API definido por JCheckBox y JCheckBoxMenuItem que utilizaremos son los constructores.

> Constructores de CheckBox
> Constructor | Propósito
> --- | ---
> JCheckBox(String) JCheckBox(String, boolean) JCheckBox(Icon) JCheckBox(Icon, boolean) JCheckBox(String, Icon) JCheckBox(String, Icon, boolean) JCheckBox() | Crea un ejemplar de JCheckBox. El argumento string específica el texto, si existe, que el checkbox debería mostrar. De forma similar, el argumento Icon específica la imagen que debería utilizarse en vez de la imagen por defecto del aspecto y comportamiento. Especificando el argumento booleano como true se inicializa el checkbox como seleccionado. Si el argumento booleano no existe o es false, el checkbox estará inicialmente desactivado.
> JCheckBoxMenuItem(String) JCheckBoxMenuItem(String, boolean) JCheckBoxMenuItem(Icon) JCheckBoxMenuItem(String, Icon) JCheckBoxMenuItem(String, Icon, boolean) JCheckBoxMenuItem() | Crea un ejemplar de JCheckBoxMenuItem. Los argumentos se interpretan de la misma forma que en los constructores de JCheckBox.

#### Ejemplos que utilizan CheckBoxes

> Los siguientes ejemplos utilizan checkboxes como botones o como ítems de menús.

> Ejemplo | Dónde se Describe | Notas
> --- | --- | ---
> CheckBoxDemo.java | Esta página. | Utiliza botones checkbox para determinar cual de las 16 imágenes se debería mostrar.
> ActionDemo.java | Cómo usar Actions | Utiliza checkbox como ítems de menú para seleccionar el estado del programa.

Ozito