miércoles, 10 de octubre de 2012

Cómo quitar la selección a un grupo de JRadioButtons en Java

Hace un tiempo en uno de mis proyectos, me vi en la necesidad de resetear, limpiar, borrar o quitar el valor de selección de los llamados botones de radio (JRadioButton en Java). En dicho proyecto tenía un formulario en el cual tenía diferentes controles o componentes (cajas de texto, listas de selección, combos de selección, botones de radio o de opción, etc); el hecho era que el usuario tenía un botón para "guardar" un registro una vez que completaba el formulario, pero también contaba con un botón llamado "limpiar" que servía para resetear el valor de todos ésos componentes y así el usuario pueda registrar un "nuevo" registro. A saber: al presionar sobre el botón "limpiar" los jTextField deberían estar vacíos, los jList no deberían tener ningún item seleccionado, ningún jRadioButton debería estar seleccionado, y en general todos los componentes que se encontraban en el formulario y que sirven para introducir datos deberían estar como a un principio.

El presente post está dirigido a aquellos programadores que se encuentran en la siguiente situación: si tenemos varios jRadioButtons en el escenario, antes de interactuar con ellos no hay ninguno seleccionado. Si seleccionamos uno se marca y el resto se desmarcan, de manera que solamente puede haber un jRadioButton de grupo (ButtonGroup) seleccionado. ¿Pero qué ocurre si una vez seleccionado un jRadioButton, queremos que vuelvan a estar todos deseleccionados o mejor dicho sin seleccionar?

Para mi en un principio, limpiar el valor que tenían los jTextField, los jTextArea, los jList y demás fue sencillo de realizar; el problema surgió cuando me topé con los jRadioButtons, quitar o desmarcar la selección de los jRadioButtons parecía también ser una tarea fácil de realizar, pero grande fue mi sorpresa cuando no encontraba un método que me permita realizar esa acción, el problema estaba en que yo buscaba ése método en la clase JRadioButton (graso error), cuando debí darme cuenta de que los jRadioButtons son agregados a un objeto de la clase ButtonGroup para que solo exista un valor seleccionado por vez, entonces fue cuando busqué el método en cuestión en la clase ButtonGroup y me encontré con el método clearSelection quien da solución a esta clase de problemas.

Para ilustrar el uso de éste método, elaboraremos un programa que consistirá en un formulario que contendrá dos jRadioButtons llamados "rdBtnMasculino" (con la etiqueta "Masculino) y "rdBtnFemenino" (con la etiqueta "Femenino"); además existirán dos botones con las etiquetas "Aceptar" y "Limpiar". El usuario podrá elegir una de las dos opciones: "Masculino" o "Femenino", cuando se presione sobre el botón "Aceptar" se desplegará un mensaje indicando qué opción fue elegida o sino eligió ninguna; el botón "Limpiar" quita la selección a los jRadioButtons que fueron añadidos al objeto de la clase ButtonGroup ("grupoBtnSexo" para este ejemplo). La interfaz gráfica quedaría de la siguiente manera:

Figura 1.- Programa que permite de-seleccionar las opciones de los jRadioButtons que se encuentran en un objeto de la clase ButtonGroup.

A continuación analizaremos los fragmentos de código más importantes.

El constructor de la clase a la que llamaremos "FormRadioButtonsReset" quedaría de la siguiente manera:
public FormRadioButtonsReset() {
     initComponents();
     this.setLocationRelativeTo(this);
     grupoBtnSexo.add(rdBtnMasculino);
     grupoBtnSexo.add(rdBtnFemenino);
}

Como muchos ya sabrán el método initComponents (línea de código 2), es un método que genera automáticamente Netbeans al crear la interfaz gráfica de usuario (Figura 1). El método setLocationRelativoTo (línea de código 3) es un método predefinido que permite centrar el formulario en la pantalla del monitor. El método add de la clase ButtonGroup (líneas de código 4 y 5) permite adicionar los objetos "rdBtnMasculino" y "rdBtnFemenino"  al objeto "grupoBtnSexo", para que solo pueda ser seleccionado uno por vez. Resaltar que "grupoBtnSexo" es un objeto de la clase ButtonGroup, lo pueden declarar y crear por código, aunque en mi caso yo lo jale de la paleta de componentes de Netbeans al formulario y luego le cambie el nombre de "buttonGroup1" a "grupoBtnSexo".

Ahora veamos el código que va dentro del botón "Aceptar" (btnAceptar):
private void btnAceptarActionPerformed(java.awt.event.ActionEvent evt) {
        if (rdBtnMasculino.isSelected()) {
            JOptionPane.showMessageDialog(this, "Ha seleccionado sexo masculino");
        } else {
            if (rdBtnFemenino.isSelected()) {
                JOptionPane.showMessageDialog(this, "Ha seleccionado sexo femenino");
            } else {
                JOptionPane.showMessageDialog(this, "No ha seleccionado ningún sexo");
            }
        }
}

El método isSelected (líneas de código 2 y 5) permite verificar si el jRadioButton correspondiente ("rdBtnMasculino" o "rdBtnFemenino") se encuentra actualmente seleccionado, de ser así se muestra por pantalla el mensaje respectivo con JOptionPane.

Finalmente el código que se ejecuta al presionar sobre el botón "Limpiar" sería:
private void btnResetActionPerformed(java.awt.event.ActionEvent evt) {
        grupoBtnSexo.clearSelection();
}

Aquí es donde usamos el método clearSelection (el tipo de la película y la razón de este post), el cual permite limpiar o eliminar la selección de todos los jRadioButtons ("rdBtnMasculino" y "rdBtnFemenino" para este ejemplo) que se hayan agregado al mismo objeto de clase ButtonGroup ("grupoBtnSexo" para este ejemplo).

Este era el problema que tenía, en el que me estaba liando más de la cuenta, busqué mil y un soluciones hasta que dí con ella, espero haber sido de ayuda y que le sirva alguien más, hasta la próxima.

Código Fuente: download/descargar

3 comentarios :

Encuesta: ¿Quién es el mejor catedrático de la carrera de Ing. Informática de la UAGRM?