Tutorial de Java

Grupos de Botones

Anterior | Siguiente

Si se quieren botones de selección única, los conocidos como botones radio, que tienen la particularidad de que solamente puede haber uno seleccionado, hay que crearse un grupo de botones, añadiendo botones a ese grupo uno a uno. Pero, Swing permite que cualquier AbstractButton pueda ser añadido a un ButtonGroup.La figura siguiente muestra los grupos de botones con la apariencia correspondiente a Swing, según se obtiene la ventana tras la ejecución del ejemplo java1406.java, que crea varios paneles de botones.

Para evitar la repetición del código correspondiente a la incorporación de cada uno de los botones, en el ejemplo se utiliza la reflexión para generar los grupos de diferentes tipos de botones. Esto se puede ver en creaPanelBotones(), que crea un grupo de botones y un JPanel, y para cada String en el array que figura como segundo argumento de creaPanelBotones(), añade un objeto de la clase indicada por el primero de los argumentos.

import java.awt.*;
import java.awt.event.*;
import com.sun.java.swing.*;
import com.sun.java.swing.border.*;
import java.lang.reflect.*;

public class java1406 extends JPanel {
  
  static String ids[] = { 
    "Mortadelo","Filemon","Carpanta", 
    "Rompetechos","Pepe Gotera","Otilio",
  };
  
  static JPanel creaPanelBotones( Class bClass,String ids[] ) {
    ButtonGroup botones = new ButtonGroup();
    JPanel panel = new JPanel();
    String titulo = bClass.getName();
    
    titulo = titulo.substring( titulo.lastIndexOf('.')+1 );
    panel.setBorder( new TitledBorder( titulo ) );
    
    for( int i=0; i < ids.length; i++ ) {
      AbstractButton botonAbs = new JButton( "fallo" );
      try {            
	// Se utiliza el constructor dinámico al que se pasa
	// una cadena como argumento
	Constructor ctor = bClass.getConstructor( new Class[] { 
	  String.class 
	  } );
	// Se crea un nuevo objeto del tipo del botón
	botonAbs = ( AbstractButton )ctor.newInstance( new Object[]{
	  ids[i]
	  } );
      } catch( Exception e ) {
	System.out.println( "No puedo crear " + bClass );
      }
      botones.add( botonAbs );
      panel.add( botonAbs );
    }
    return( panel );
  }
  
  public java1406() {
    add( creaPanelBotones( JButton.class,ids ) );
    add( creaPanelBotones( JToggleButton.class,ids ) );
    add( creaPanelBotones( JCheckBox.class,ids ) );
    add( creaPanelBotones( JRadioButton.class,ids ) );
  }
  
  public static void main( String args[] ) {
    JFrame frame = new JFrame( "Tutorial de Java, Swing" );
    frame.addWindowListener( new WindowAdapter() {
      public void windowClosing( WindowEvent evt ) {
        System.exit( 0 );
      }
    });
    frame.getContentPane().add( new java1406(),BorderLayout.CENTER );
    frame.setSize( 600,300 );
    frame.setVisible( true );
  }
}

El título se coge del nombre de la clase, eliminándole toda la información referente al camino en que se encuentra en disco. El AbstractButton es inicializado a un JButton que tiene la etiqueta "Fallo", para que si se ignora el mensaje de la excepción, todavía se pueda ver en la pantalla que hay problemas. El método getConstructor() genera un objeto Constructor que coge el array de argumentos de tipos en el array Class pasado a getConstructor(). Y ya, todo lo que hay que hacer es llamar a newInstance(), pasarle un array de Object conteniendo los argumentos actuales; en este caso concreto, la cadena obtenida desde el array de ids.

Ahora se añade un poco de complejidad a lo que antes era un proceso muy simple, para conseguir que funcione el grupo con un único botón seleccionado. Hay que crear un grupo de botones e indicarle a cada uno de los botones de ese grupo cual es el comportamiento que se desea de él. Cuando se ejecute el programa, se observará que todos los botones, excepto el JButton, disponen de ese comportamiento de exclusividad, marcándose y desmarcándose automáticamente, en función de la pulsación del ratón sobre el botón.

Navegador

Home | Anterior | Siguiente | Indice | Correo