Respuesta a las acciones del usuario sobre un grupo de controles (casillas y botones de radio)

prev.gif (997 bytes)chapter.gif (1105 bytes)home.gif (1232 bytes)next.gif (1211 bytes)

Sucesos (events)

Respuesta a las acciones sobre controles casilla de verificación (Checkbox)

Respuesta a las acciones del usuario sobre un grupo de botones de radio


Respuesta a las acciones sobre casillas de verificación (Checkbox)

disco.gif (1035 bytes)casilla: CasillaApplet.java

 

El control Checkbox

Una casilla de verificación es un objeto de la clase Checkbox. Para crear tres casillas de verificación se llama a alguno de sus constructores

  	Checkbox chkCorbata = new Checkbox();
  	Checkbox chkChaqueta = new Checkbox();
  	Checkbox chkSombrero = new Checkbox();

Establecemos el título o texto que identifica cada una de las casillas con la función miembro setLabel

    	chkCorbata.setLabel("Corbata");
    	chkChaqueta.setLabel("Chaqueta");
    	chkSombrero.setLabel("Sombrero");

Establecemos su estado inicial mediante la función miembro setState. Si queremos que la casilla titulada "Sombrero" aparezca inicialmente activada (checked), se escribe

	chkSombrero.setState(true);

La función getState, devuelve true, si la casilla está activada (checked) y false cuando está desactivada (unchecked)

	boolean estado=chkCorbata.getState()

Propósito

Tenemos tres casillas tituladas Corbata, Chaqueta y Sombero inicialmente desactivadas. Cuando se activan se imprime un mensaje que indica que prenda o prendas lleva puestas.

Diseño

Crear el applet, situar tres casillas (Checkbox) en la parte superior.

Cambiar sus propiedades name y label en sus respectivas hojas de propiedades

Establecer FlowLayout, como gestor de diseño del applet. Cambiar la propiedad hgap para separar horizontalmente los botones.

Redefinir la función paint para mostrar el mensaje

Respuesta a las acciones del usuario

Para manejar los sucesos que se producen en las casillas de verificación se deben seguir los mismos pasos que para seleccionar un elemento en una lista o en una caja de selección.

Siguiendo el modelo denominado Standard adapter empleado para manejar los sucesos que provienen de tres botones, creamos una clase ItemCasillas que implemente el interface ItemListener, y defina la función itemStateChanged.

class ItemCasillas implements ItemListener{
    private CasillaApplet applet;
    public ItemCasillas(CasillaApplet applet){
        this.applet=applet;
    }
    public void itemStateChanged(ItemEvent ev){
        applet.casillas_itemStateChanged(ev);
    }
 }

Creamos un objeto item de la clase ItemCasillas y le pasamos this, el objeto applet, para inicializar el miembro dato applet de la clase ItemCasillas. En la definición de la función miembro itemStateChanged, se llama a la función respuesta casillas_itemStateChanged.

    ItemCasillas item=new ItemCasillas(this);

Asociamos mediante addItemListener cada una de las casillas de verificación con el objeto item que registra las acciones sobre estos controles.

    chkCorbata.addItemListener(item);
    chkChaqueta.addItemListener(item);
    chkSombrero.addItemListener(item);

En la definición de la función respuesta casillas_itemStateChanged, se describe la tarea a realizar. En nuestro caso, describe como viste una persona:

La función getState, devuelve true, si la casilla está activada (checked) y false cuando está desactivada (unchecked)

  public void casillas_itemStateChanged(ItemEvent ev){
    texto="Cómo viste: ";
    if(chkCorbata.getState()){
        texto+="lleva corbata, ";
    }
    if(chkChaqueta.getState()){
        texto+="viste chaqueta, ";
    }
    if(chkSombrero.getState()){
        texto+="se pone el sombrero, ";
    }   repaint();
  }

Finalmente, se llama la función paint para mostar el texto resultante, mediante la llamada a la función drawString.

  public void paint(Graphics g){
    g.drawString(texto, 10, 50);
  }

El código completo de este ejemplo, es el siguiente

package casilla;

import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class CasillaApplet extends Applet {
  Checkbox chkCorbata = new Checkbox();
  Checkbox chkChaqueta = new Checkbox();
  Checkbox chkSombrero = new Checkbox();
  FlowLayout flowLayout1 = new FlowLayout();
  String texto="Cómo viste: ";
 
  public void init() {
    chkCorbata.setLabel("Corbata");
    chkChaqueta.setLabel("Chaqueta");
    chkSombrero.setLabel("Sombrero");
    ItemCasillas item=new ItemCasillas(this);
    chkCorbata.addItemListener(item);
    chkChaqueta.addItemListener(item);
    chkSombrero.addItemListener(item);
    flowLayout1.setHgap(10);
    this.setLayout(flowLayout1);
    this.add(chkCorbata, null);
    this.add(chkChaqueta, null);
    this.add(chkSombrero, null);
  }
  public void casillas_itemStateChanged(ItemEvent ev){
    texto="Cómo viste: ";
    if(chkCorbata.getState()){
        texto+="lleva corbata, ";
    }
    if(chkChaqueta.getState()){
        texto+="viste chaqueta, ";
    }
    if(chkSombrero.getState()){
        texto+="se pone el sombrero, ";
    }
    repaint();
  }

  public void paint(Graphics g){
    g.drawString(texto, 10, 50);
  }
}

class ItemCasillas implements ItemListener{
    private CasillaApplet applet;
    public ItemCasillas(CasillaApplet applet){
        this.applet=applet;
    }
    public void itemStateChanged(ItemEvent ev){
        applet.casillas_itemStateChanged(ev);
    }
 }

 

Respuesta a las acciones del usuario sobre un grupo de botones de radio

disco.gif (1035 bytes)radio: RadioApplet.java

En la página anterior hemos visto como se define una respuesta única a la acción sobre un conjunto de tres botones. Un grupo de botones de radio, es una elección más acertada que un conjunto de tres botones, ya que en un grupo uno sólo de los botones de radio está en estado activado. Para crear un grupo de botones de radio es necesario seguir los siguientes pasos.

Los controles Checkbox y CheckboxGroup

Se crean los controles del tipo Chekbox y un control CheckboxGroup.

  Checkbox chkRojo = new Checkbox();
  Checkbox chkVerde = new Checkbox();
  Checkbox chkAzul = new Checkbox();
  CheckboxGroup chkGrupo=new  CheckboxGroup();

En init se pone una etiqueta para identificar cada uno de los botones de radio, mediante setLabel,

    chkRojo.setLabel("Rojo");
    chkVerde.setLabel("Verde");
    chkAzul.setLabel("Azul");

Se asocia cada uno de los botones de radio con su grupo, el objeto chkGrupo de la clase CheckboxGroup. Por último, se establece el botón de radio en estado activado, que se presenta inicialmente cuando aparece el applet, mediante la función miembro setSelectedCheckbox de la clase CheckboxGroup.

    chkRojo.setCheckboxGroup(chkGrupo);
    chkVerde.setCheckboxGroup(chkGrupo);
    chkAzul.setCheckboxGroup(chkGrupo);
    chkGrupo.setSelectedCheckbox(chkRojo);

Para obtener el botón de radio que ha sido seleccionado se llama a la función miembro getSelectedCheckbox de la clase CheckboxGroup.

    Checkbox radio=chkGrupo.getSelectedCheckbox();

Propósito

El applet contiene un conjunto de tres botones de radio situados en la parte superior del applet. El nombre de los botones es el de los colores primarios: azul, verde y rojo.  Al activar un botón de radio se pinta un rectángulo de dicho color.

Diseño

Crear el applet, situar tres botones de radio (Checkbox) en la parte superior.

Cambiar sus propiedades name y label en las correspondiente hoja de propiedades

Establecer FlowLayout, como gestor de diseño del applet. Cambiar la propiedad hgap para separar horizontalmente los botones.

En el código fuente crear un objeto de la clase CheckboxGroup, asociar mediante setCheckboxGroup cada botón de radio al grupo. Establecer el botón de radio inicialmente activado.

Crear un array colores de objetos de la clase Color con los tres colores primerios: rojo, verde y azul.

  final Color[] colores={Color.red, Color.green, Color.blue};

Redefinir la función paint para pintar un rectángulo

Respuesta a las acciones del usuario

Para responder a las acciones sobre un grupo de botones de radio empleamos el modelo denominado Standard adapter, se ha de crear una clase que denominamos ItemRadio que implemente el interface ItemListener. La clase define la función itemStateChange. La información acerca del suceso viene encapsulada en el objeto ev de la clase ItemEvent.

class ItemRadio implements ItemListener{
    private RadioApplet applet;
    public ItemRadio(RadioApplet applet){
        this.applet=applet;
    }
    public void itemStateChanged(ItemEvent ev){
        applet.radio_itemStateChanged(ev);
    }
 }

Se crea un objeto item de la clase ItemRadio y se le pasa this al constructor, para inicializar el miembro dato applet de la clase ItemRadio. En la definición de la función miembro itemStateChanged, se llama a la función respuesta radio_itemStateChanged.

    ItemRadio item=new ItemRadio(this);

Asociamos, mediante addItemListener, cada una de los botones de radio con el objeto item que está interesado en las acciones sobre dichos controles.

    chkRojo.addItemListener(item);
    chkVerde.addItemListener(item);
    chkAzul.addItemListener(item);

En la definición de la función respuesta radio_itemStateChanged, se describe la tarea a realizar. En nuestro caso dibujar un rectángulo del color que se corresponde con el título del botón de radio.

Primero tenemos que saber sobre cual de los botones de radio hemos actuado, para ello se llama a la función miembro setSelectedCheckbox, de la clase CheckboxGroup. Posteriormente, obtenemos el índice del color del botón de radio que ha sido activado

 public void radio_itemStateChanged(ItemEvent ev){
    Checkbox radio=chkGrupo.getSelectedCheckbox();
    if(radio.equals(chkRojo)){
        indice=0;
    }
    if(radio.equals(chkVerde)){
        indice=1;
    }
    if(radio.equals(chkAzul)){
        indice=2;
    }
    repaint();
  }

Finalmente, se llama la función paint para dibujar el rectángulo pintado del color seleccionado.

  public void paint(Graphics g){
    g.setColor(colores[indice]);
    g.fillRect(20, 50, 100, 50);
  }

Además de las funciones miembro de la clase Checkbox, el objeto ev de la clase ItemEvent, nos suministra información acerca del suceso originado por la acción del usuario. Así, getItemSelectable nos devuelve el control sobre el que se ha actuado. getStateChanged nos devuelve un entero que nos indica entre otras cosas, si la casilla sobre la que se ha actuado ha sido activada o desactivada. El código equivalente de la función respuesta radio_itemStateChanged, sería el siguiente

  public void radio_itemStateChanged(ItemEvent ev){
    Object fuente = ev.getItemSelectable();
    if((fuente==chkRojo)&& (ev.getStateChange() == ItemEvent.SELECTED)){
	    indice=0;
    }
    if((fuente==chkVerde)&& (ev.getStateChange() == ItemEvent.SELECTED)){
	    indice=1;
    }
    if((fuente==chkAzul)&& (ev.getStateChange() == ItemEvent.SELECTED)){
	    indice=2;
    }
    repaint();
 }

El código completo de este ejemplo, es el siguiente

package radio;

import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class RadioApplet extends Applet {
  Checkbox chkRojo = new Checkbox();
  Checkbox chkVerde = new Checkbox();
  Checkbox chkAzul = new Checkbox();
  CheckboxGroup chkGrupo=new  CheckboxGroup();
  FlowLayout flowLayout1 = new FlowLayout();
  final Color[] colores={Color.red, Color.green, Color.blue};
  int indice;

  public void init() {
    chkRojo.setLabel("Rojo");
    chkVerde.setLabel("Verde");
    chkAzul.setLabel("Azul");
    chkRojo.setCheckboxGroup(chkGrupo);
    chkVerde.setCheckboxGroup(chkGrupo);
    chkAzul.setCheckboxGroup(chkGrupo);
    chkGrupo.setSelectedCheckbox(chkRojo);

    ItemRadio item=new ItemRadio(this);
    chkRojo.addItemListener(item);
    chkVerde.addItemListener(item);
    chkAzul.addItemListener(item);
    flowLayout1.setHgap(10);
    this.setLayout(flowLayout1);
    this.add(chkRojo, null);
    this.add(chkVerde, null);
    this.add(chkAzul, null);
  }

  public void radio_itemStateChanged(ItemEvent ev){
    Checkbox radio=chkGrupo.getSelectedCheckbox();
    indice=0;
    if(radio.equals(chkRojo)){
        indice=0;
    }
    if(radio.equals(chkVerde)){
        indice=1;
    }
    if(radio.equals(chkAzul)){
        indice=2;
    }
    repaint();
  }

  public void paint(Graphics g){
    g.setColor(colores[indice]);
    g.fillRect(20, 50, 100, 50);
  }
}

class ItemRadio implements ItemListener{
    private RadioApplet applet;
    public ItemRadio(RadioApplet applet){
        this.applet=applet;
    }
    public void itemStateChanged(ItemEvent ev){
        applet.radio_itemStateChanged(ev);
    }
 }