Checks Toggles y Radio Buttons en Java

De ChuWiki

Veamos aquí lo básico de JToggleButton, JCheckBox y JRadioButton. Son iguales en su comportamiento, pero distintos en su apariencia visual. Por ello suelen emplearse de distintas maneras.

  • JToogleButton es un botón que se queda apretado al pulsarlo y se desaprieta de nuevo al pulsarlo por segunda vez.
  • JCheckBox es una cajita que queda "checkeada" cuando se hace click en ella y de quita el "check" cuando se vuelve a hacer click. Como se ve, es igual el JToggleButton pero se dibuja de distinta forma.
  • JRadioButton como el JCheckBox pero en forma de circulito. Se suele usar cuando hay varias opciones a elegir en una ventana y sólo se puede elegir una de ellas.

En la siguiente imagen tienes ejemplos de los tres tipos de botón

Y pudes ver código completo en checks, radios and toggles examples

JCheckBox[editar]

El JCheckBox se instancia como cualquier otro componente Swing. Podemos pasarle en el constructor la etiqueta que queremos que sea visible para el usuario, un icono y si lo queremos inicialmente o no marcado. Hay varios constructores que permiten poner todas o algunas de estas opciones.

En general nos bastará con poner la etiqueta para el JCheckBox. Si ponemos un icono en el constructor, este reemplazara a la cajita en la que se hace el "check" y será el icono que se muestre si la cajita no está marcada. Debemos entonces llamar al método setSelectedIcon() para pasarle otro icono que será el que se mostrará cuando la cajita esté seleccionada. Esto nos permitiría dibujar unos JCheckBox con un estilo más a nuestra medidad que el que viene por defecto.

Veamos ambos casos en el siguiente ejemplo de código

// Without icon
JCheckBox normalCheck = new JCheckBox("some label");

// With icon
JCheckBox graphicCheck = new JCheckBos("some label", new ImageIcon("/path/unchecked-icon.png");
graphicCheck.setSelectedIcon (new ImageIcon("/path/checked-icon.png");

Desde código, para saber si un JCheckBox está o no marcado, usaremos el método isSelected()

JCheckBox check = new JCheckBox("Check me");
...
if (check.isSelected()) {
   // checkbox is checked
} else {
   // checkbox is unchecked
}

Para cambiar el estado desde código, usaremos el método setSelected(boolean)

JCheckBox check = new JCheckBox("Check me");
...
check.setSelected(true);
...
check.setSelected(false);

Podemos enterarnos de cambios en el "check" simplemente añadiendo un ActionListener.

JCheckBox check = new JCheckBox("Check me");
check.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent event) {
       // Some code
   }
});

Dentro del ActionListener, si el "check" no está accesible para comprobar su estado, se puede obtener a partir del evento que nos pasan como parámetro

public void actionPerformed(ActionEvent event) {
   boolean selected = ((JCheckBox)event.getSource()).isSelected()
   // Some code
}


JToggleButton[editar]

Poco podemos decir nuevo del JToogleButton, salvo el aspecto visual es igual que JCheckBox. El código anterior es válido para JToggleButton sin más que cambiar JCheckBox por JToggleButton


JRadioButton[editar]

Igual que los dos anteriores, salvo el aspecto visual. El código sería exactamente igual.

La única diferencia es que habitualmente se ponen varios JRadioButton juntos y sólo se permite seleccionar uno de ellos, de forma que al seleccionar uno, se deseleccionan automáticamente los demás si estuvieran seleccionados. Este comportamiento no está por defecto en los JRadioButton, ya que no saben con qué otros JRadioButton están agrupados. Este comportamiento debe prograrmse usando la clase ButtonGroup. El ejemplo básico de código podría ser el siguiente

JRadioButton radio1 = new JRadioButton("Radio 1");
JRadioButton radio2 = new JRadioButton("Radio 2");
...
JRadioButton radioN = new JRadioButton("Radio n");

ButtonGroup group = new ButtonGroup();
group.add(radio1);
group.add(radio2);
...
group.add(radioN);

Simplemente hemos instanciado un ButtonGroup y hemos llamado a su método add() para ir añadiendo los distintos JRadioButton que deben ser excluyentes entre sí. Con esto está hecho todo lo necesario.

Una vez marcado uno de los JRadioButton, con el ratón no puede volverse a la situación inicial en que estén todos desmarcados. O bien los desmarcamos llamando al método setSelected(false) de cada JRadioButton, o bien podemos usar el método clear() de ButtonGroup, que se encarga de eso mismo.

Es interesante saber que ButtonGroup en su método add() admite AbstractButton, y no solo JRadioButton. Por ello, podríamos poner los JCheckBox y los JToggleButton y obtener el mismo comportamiento que con los JRadioButton.