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