7.5 BOTONES DE RADIO (JRadioButton)

 

Bienvenidos a todos a un post más de Java, este post es bastante extenso pero de esta manera se explica los botones de radio en una tirada y si hacéis las prácticas a la par de la explicación del post pues seguramente se os haga más ameno. Los RadioButton o los botones de opciones permiten seleccionar un conjunto de opciones excluyendo las demás, es decir, a diferencia de los CheckBox que vimos en el post anterior que sí que permiten tener varios checks seleccionados, los radiobutton solo se puede seleccionar uno.

Para construir los radiobutton lo podemos hacer de forma individual con la clase JRadioButton o creando una agrupación de radiobutton con la clase ButtonGroup:



Vamos a verlo mediante una práctica cuyo código es el siguiente:

package swing;

 

import javax.swing.JFrame;

import javax.swing.JPanel;

 

public class BotonOpcion {

 

       public static void main(String[] args) {

           

             MarcoRadio mimarco = new MarcoRadio();

           

             mimarco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

       }

 

}

 class MarcoRadio extends JFrame {

     

       public MarcoRadio(){

           

             setBounds(550, 300, 550, 350);

           

             setVisible(true);

           

             LaminaRadio milamina = new LaminaRadio();

           

             add(milamina);

           

       }

}

 class LaminaRadio extends JPanel {

       

        public LaminaRadio() {

 

        }

     

 }

Dentro del constructor de la lámina vamos a crear un grupo utilizando la clase ButtonGroup, lo que hace esta clase es que nos da la posibilidad de agrupar varios componentes funcionando como un todo:

class LaminaRadio extends JPanel {

       

        public LaminaRadio() {

           

            ButtonGroup migrupo = new ButtonGroup();

 

        }

     

 }

Después instanciamos tres botones:

        public LaminaRadio() {

           

            ButtonGroup migrupo = new ButtonGroup();

           

            JRadioButton boton1 = new JRadioButton("Verde", false);

           

            JRadioButton boton2 = new JRadioButton("Azul", true);

           

            JRadioButton boton3 = new JRadioButton("Rojo", false);

 

 

        }

Si vamos a la API de Java para ver la clase JRadioButton veremos que tiene sobrecarga de constructores, el que vamos a utilizar es el más sencillo, le pasamos dos parámetros el texto que va a mostrar al lado del radibutton y el segundo parámetro indicamos si está activado o no, en este caso el boton2 es el que va a estar activado.

El siguiente paso es indicarle que estos tres botones pertenecen a migrupo con el objetivo de que todos funcionen como una unidad y solo uno de ellos pueda estar seleccionado.

        public LaminaRadio() {

           

            ButtonGroup migrupo = new ButtonGroup();

           

            JRadioButton boton1 = new JRadioButton("Verde", false);

           

            JRadioButton boton2 = new JRadioButton("Azul", true);

           

            JRadioButton boton3 = new JRadioButton("Rojo", false);

           

            migrupo.add(boton1);

           

            migrupo.add(boton2);

           

            migrupo.add(boton3);

 

        }

Una vez añadidos al grupo hay que añadir los botones a la lámina, EL GRUPO NO SE AÑADE A LÁMINA, lo que se añade a la lámina son los componentes uno a uno:

public LaminaRadio() {

           

            ButtonGroup migrupo = new ButtonGroup();

           

            JRadioButton boton1 = new JRadioButton("Verde", false);

           

            JRadioButton boton2 = new JRadioButton("Azul", true);

           

            JRadioButton boton3 = new JRadioButton("Rojo", false);

           

            migrupo.add(boton1);

           

            migrupo.add(boton2);

           

            migrupo.add(boton3);

           

            add(boton1);

           

            add(boton2);

           

            add(boton3);

 

 

        }

Probamos:



Esta el radiobutton Azul seleccionado tal y como le hemos indicado en el código, si ahora seleccionamos el Verde automáticamente se deselecciona el check del Azul:



Esto es debido a que están dentro de un grupo y funcionan como una unidad, tiene que haber uno seleccionado, en el momento que se selecciona uno se desactiva la selección del anterior. Este es el comportamiento de haberlos declarado los radiobutton en un grupo.

Si no los hubiéramos incluido en un grupo funcionarían como checkbox, podría haber más de un radiobutton seleccionado.

Por otra parte, puede darse el caso de que en lugar de tres radiobutton hayan cinco y queremos que tres de ellos funcionen como una unidad y los otros dos como otra unidad diferente. Para verlo más claro, nos creamos un segundo grupo, creamos dos botones, añadimos estos dos botones al segundo grupo y los añadimos a la lámina:

public LaminaRadio() {

           

            ButtonGroup migrupo = new ButtonGroup();

           

            ButtonGroup migrupo2 = new ButtonGroup();

           

            JRadioButton boton1 = new JRadioButton("Verde", false);

           

            JRadioButton boton2 = new JRadioButton("Azul", true);

           

            JRadioButton boton3 = new JRadioButton("Rojo", false);

           

            JRadioButton boton4 = new JRadioButton("Masculino",false);

           

            JRadioButton boton5 = new JRadioButton("Femenino", false);

           

            migrupo.add(boton1);

           

            migrupo.add(boton2);

           

            migrupo.add(boton3);

           

            migrupo2.add(boton4);

           

            migrupo2.add(boton5);

           

            add(boton1);

           

            add(boton2);

           

            add(boton3);

           

            add(boton4);

           

            add(boton5);

 

 

 

        }

Si probamos la aplicación:



Si ahora seleccionamos el radiobutton Masculino, el radiobutton Azul va a permanecer seleccionado ya que pertenece a otro grupo:



Ya hemos visto la sintaxis de los JRadioButton vamos a crear otro ejemplo para darle funcionalidad a estos objetos y que respondan a eventos. La práctica va a consistir en crear un marco con un texto y en la parte inferior que aparezca un grupo de JRadioButton que lo que va a hacer es cambiar el tamaño del texto, para ello nos creamos un nuevo archivo cuyo código inicial es el siguiente:

package swing;

 

import javax.swing.JFrame;

import javax.swing.JPanel;

 

public class Ejemplo_radio {

       

    public static void main(String[] args) {

        

          Marco_Radio mimarco = new Marco_Radio();

        

          mimarco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

    }

 

}

class Marco_Radio extends JFrame {

  

    public Marco_Radio(){

        

          setBounds(550, 300, 550, 350);

        

          setVisible(true);

        

          Lamina_Radio milamina = new Lamina_Radio();

        

          add(milamina);

        

    }

}

class Lamina_Radio extends JPanel {

    

     public Lamina_Radio() {

    

     }

  

}

Lo primero que vamos a hacer es declarar las variables:

    public Lamina_Radio() {

    

     }

   private JLabel texto;

  

   private JRadioButton boton1, boton2, boton3, boton4;

}

Como lo que queremos es que el texto aparezca en la parte central de la lámina y los radiobutton en la parte inferior por lo que habrá que trabajar con Layouts, se lo hemos de indicar dónde queremos que aparezca en el marco, así que dentro del constructor de la lámina le indicamos que vamos a trabajar con un BorderLayout:

     public Lamina_Radio() {

       

       setLayout(new BorderLayout());

    

     }

A continuación creamos el texto:

     public Lamina_Radio() {

       

       setLayout(new BorderLayout());

       

       texto=new JLabel("Curso completo de Java");

    

     }

Añadimos el texto a la zona central:

     public Lamina_Radio() {

       

       setLayout(new BorderLayout());

       

       texto=new JLabel("Curso completo de Java");

       

       add(texto, BorderLayout.CENTER);

    

     }

Los botones de radio van a ser cuatro y queremos que funcione como una unidad, es decir, que cuando se seleccione un botón no se pueda seleccionar otro a la vez por lo que creamos un grupo al que vamos a llamar migrupo:

     public Lamina_Radio() {

       

       setLayout(new BorderLayout());

       

       texto=new JLabel("Curso completo de Java");

       

       add(texto, BorderLayout.CENTER);

       

       ButtonGroup migrupo=new ButtonGroup();

    

     }

Creamos los cuatro botones:

public Lamina_Radio() {

       

       setLayout(new BorderLayout());

       

       texto=new JLabel("Curso completo de Java");

       

       add(texto, BorderLayout.CENTER);

       

       ButtonGroup migrupo=new ButtonGroup();

       

       boton1 = new JRadioButton("Pequeño", false);

       

       boton2 = new JRadioButton("Mediano", true);

       

       boton3 = new JRadioButton("Grande", false);

       

       boton4 = new JRadioButton("Muy grande", false);

    

     }

Indicamos que el boton2 este activo por defecto. Añadimos estos botones a una segunda lámina que a su vez estarán agregados a la primera lámina. Creamos la segunda lámina, agrupamos los botones y los añadimos a la lámina:

JPanel laminaradio=new JPanel();

       

       migrupo.add(boton1);

       

       migrupo.add(boton2);

       

       migrupo.add(boton3);

       

       migrupo.add(boton4);

       

       laminaradio.add(boton1);

       

       laminaradio.add(boton2);

       

       laminaradio.add(boton3);

       

       laminaradio.add(boton4);

Agregamos la segunda lámina la que contiene los botones a la zona sur de la lámina principal:

add(laminaradio, BorderLayout.SOUTH);

Con esto lo que hemos creado ha sido la interfaz gráfica, si probamos:



Ahora nos falta darle interactividad de forma que si seleccionamos el radiobutton pequeño el texto a de aparecer más pequeño, si seleccionamos el radiobutton grande el texto se hará más grande… Por lo que después del constructor de la lámina nos creamos una clase interna que sea la que maneje los eventos, esta clase ha de implementar la interfaz actionListener para responder al evento clic:

     private class evento_radio implements ActionListener {

 

            @Override

            public void actionPerformed(ActionEvent e) {

                  // TODO Auto-generated method stub

                 

            }

       

       

     }

Instanciamos esta clase dentro del constructor de la lamina y ponemos los botones a la escucha:

evento_radio mievento=new evento_radio();

       boton1.addActionListener(mievento);

       

       boton2.addActionListener(mievento);

       

       boton3.addActionListener(mievento);

       

       boton4.addActionListener(mievento);

Dentro del método actionPerformed tenemos que detectar que radiobutton hemos pulsado esto lo hacemos con getSource que aplicamos al objeto del evento, lo hacemos mediante un condicional if:

public void actionPerformed(ActionEvent e) {

                 

                  if(e.getSource()==boton1) {

                       

                        texto.setFont(new Font("Serif", Font.PLAIN, 10));

                  }else if(e.getSource()==boton2) {

                       

                        texto.setFont(new Font("Serif", Font.PLAIN, 12));

                  }else if(e.getSource()==boton3) {

                       

                        texto.setFont(new Font("Serif", Font.PLAIN, 14));

                  }else if(e.getSource()==boton4) {

                       

                        texto.setFont(new Font("Serif", Font.PLAIN, 18));

                  }

                 

            }

Probamos:





Con esto ha sido todo, con cualquier duda me lo podéis hacer llegar a través de los comentarios del blog. Hasta pronto!

7.4 CHECKBOX << >> 7.6 COMBOBOX



No hay comentarios:

Publicar un comentario