## Cómo Utilizar la clase Button

Para crear un botón, se ejemplariza una de las muchas subclases de la clase AbstractButton. Esta sección explica el API básico que define la clase AbstractButton -- y lo que todos los botones Swing tienen en común. Como la clase JButton desciende de AbstractButton define un pequeño API público adicional, está página lo utiliza para ver cómo funcionan los botones.

> Nota:En Swing 1.0.2, los botones ignoraban sus mnemónicos (teclas aceleradoras). Este error se corrigió en Swing 1.0.3.

La siguiente tabla muestra las subclases de AbstractButton definidas en Swing que podemos utilizar:

Clase | Sumario | Dónde se Describe
--- | --- | ---
JButton | Un botón común | En esta sección.
JCheckBox | Un checkbox típico | Cómo usar CheckBox
JRadioButton | Un botón de rádio de un grupo. | Cómo usar RadioButton
JMenuItem | Un ítem de un menú. | Cómo usar Menu
JToggleButton | Implementa la funcionalidad heredada de JCheckBox y JRadioButton. | En ningún lugar de este tutorial.

> Nota:Si queremos juntar un grupo de botones dentro de una fila o una columna deberíamos chequear Cómo usar toolbar.

Aquí tienes una imagen de una aplicación que muestra tres botones:

> Intenta esto:
> 1. Compila y ejecuta la aplicación. El fichero fuente está en ButtonDemo.java.
>    Puedes ver Empezar con Swing si necesitas ayuda.
> 2. Pulsa el botón izquierdo.
>    Deshabalita el botón central (y a sí mismo, ya que no es necesario) y activa el botón derecho.
> 3. Pulsa el botón derecho.
>    Activa los botones central e izquierdo y se desactiva a a sí mismo.

Como muestra el ejemplo ButtonDemo, un botón Swing puede mostrar tanto texto como una imagen. En ButtonDemo, cada botón tiene su texto en un sitio diferente. La letra subrayada de cada texto de botón muestra el mnemónico -- la tecla alternativa -- para cada botón.

Cuando un botón se desactiva, le aspecto y comportamiento genera automáticamente la apariencia de botón desactivado. Sin embargo, podríamos proporcionar una imagen para que substituya la imagen normal. Por ejemplo, podría proporcionar versiones en gris de las imagenes utilizadas en los botones de la derecha y de la izquierda.

Cómo se implementa el manejo de eventos depende del tipo de botón utilizado y de cómo se utiliza. Generalmente, implementamos un action listener, que es notificado cada vez que el usuario pulsa el botón, Para un checkbox normalmente se utiliza un item listener, que es notificado cuando el checkbox es seleccionado o deseleccionado.

Abajo podemos ver el código de ButtonDemo.java que crea los botones del ejemplo anterior y reacciona a las pulsaciones de los botones. El código en negrita es el código que permanecería si los botones no tuvieran imágenes.

    //In initialization code:
        ImageIcon leftButtonIcon = new ImageIcon("images/LEFT.gif");
        ImageIcon middleButtonIcon = new ImageIcon("images/middle.gif");
        ImageIcon LEFTButtonIcon = new ImageIcon("images/left.gif");

        b1 = new JButton("Disable middle button", leftButtonIcon);
        b1.setVerticalTextPosition(AbstractButton.CENTER);
        b1.setHorizontalTextPosition(AbstractButton.LEFT);
        b1.setMnemonic('d');
        b1.setActionCommand("disable");

        b2 = new JButton("Middle button", middleButtonIcon);
        b2.setVerticalTextPosition(AbstractButton.BOTTOM);
        b2.setHorizontalTextPosition(AbstractButton.CENTER);
        b2.setMnemonic('m');

        b3 = new JButton("Enable middle button", LEFTButtonIcon);
        //Use the default text position of CENTER, LEFT.
        b3.setMnemonic('e');
        b3.setActionCommand("enable");
        b3.setEnabled(false);

        //Listen for actions on buttons 1 and 3.
        b1.addActionListener(this);
        b3.addActionListener(this);
        . . .
    }

    public void actionPerformed(java.awt.event.ActionEvent e) {
        if (e.getActionCommand().equals("disable")) {
            b2.setEnabled(false);
            b1.setEnabled(false);
            b3.setEnabled(true);
        } else {
            b2.setEnabled(true);
            b1.setEnabled(true);
            b3.setEnabled(false);
        }
    }

#### El API Button

> Las siguientes tablas listan los métodos y constructores más utilizados de AbstractButton y JButton. Podemos ver la mayoría de este API jugando con el panel de botones del ejemplo SwingSet que forma parte de la versión Swing.

> El API para utilizar botones se divide en tres categorias:

> - Seleccionar u obtener el contenido de un botón
> - Ajuste fino de la apariencia del botón
> - Implementar la funcionalidad del botón

> Seleccionar u obtener el contenido de un botón
> Método o Constructor | Propósito
> --- | ---
> JButton(String, Icon) JButton(String) JButton(Icon) JButton() | Crea un ejemplar de JButton, lo inicializa para tener el texto/imagen especificado.
> void setText(String) String getText() | Selecciona u obtiene el texto mostrado en el botón.
> void setIcon(Icon) Icon getIcon() | Selecciona u obtiene la imagen mostrada por el botón cuando no está seleccionado o pulsado.
> void setDisabledIcon(Icon) Icon getDisabledIcon() | Selecciona u obtiene la imagen mostrada por el botón cuando está desactivado. Si no se especifica una imagen, el aspecto y comportamiento crea una por defecto.
> void setPressedIcon(Icon) Icon getPressedIcon() | Seleccion u obtiene la imagen mostrada por el botón cuando está puslado.
> void setSelectedIcon(Icon) Icon getSelectedIcon() void setDisabledSelectedIcon(Icon) Icon getDisabledSelectedIcon() | Selecciona u obtiene la imagen mostrada por el botón cuando está seleccionado. Si no se especifica una imagen de botón desactivado seleccionado, el aspecto y comportamiento crea una manipulando la imagen de seleccionado.
> setRolloverEnabled(boolean) boolean getRolloverEnabled() void setRolloverIcon(Icon) Icon getRolloverIcon() void setRolloverSelectedIcon(Icon) Icon getRolloverSelectedIcon() | Utiliza setRolloverEnabled(true) y setRolloverIcon(someIcon) para hacer que el botón muestre el icono especificado cuando el cursor pasa sobre él.

> Ajuste fino de la apariencia del botón
> Método o constructor | Propósito
> --- | ---
> void setHorizontalAlignment(int) void setVerticalAlignment(int) int getHorizontalAlignment() int getVerticalAlignment() | Selecciona u obtiene dónde debe situarse el contenido del botón. La clase AbstractButton permite uno de los siguientes valores para alineamineto horizontal: LEFT, CENTER (por defecto), y LEFT. Para alineamiento vertical: TOP, CENTER (por defecto), y BOTTOM.
> void setHorizontalTextPosition(int) void setVerticalTextPosition(int) int getHorizontalTextPosition() int getVerticalTextPosition() | Selecciona u obtiene dónde debería situarse el texto del botón con respecto a la imagen. La clase AbstractButton permite uno de los siguientes valores para alineamineto horizontal: LEFT, CENTER (por defecto), y LEFT. Para alineamiento vertical: TOP, CENTER (por defecto), y BOTTOM.
> void setMargin(Insets) Insets getMargin() | Selecciona u obtiene el número de pixels entre el borde del botón y sus contenidos.
> void setFocusPainted(boolean) boolean isFocusPainted() | Selecciona u obtiene si el botón debería parecer diferente si obtiene el foco.
> void setBorderPainted(boolean) boolean isBorderPainted() | Selecciona u obtiene si el borde del botón debería dibujarse.

> Implementa la funcionalidad del botón
> Método o Constructor | Propósito
> --- | ---
> void setMnemonic(char) char getMnemonic() | Selecciona la tecla alternativa para pulsar el botón.
> void setActionCommand(String) String getActionCommand(void) | Selecciona u obtiene el nombre de la acción realizada por el botón.
> void addActionListener(ActionListener) ActionListener removeActionListener() | Añade o elimina un objeto que escucha eventos action disparados por el botón.
> void addItemListener(ItemListener) ItemListener removeItemListener() | Añade o elimina un objeto que escucha eventos items disparados por el botón.
> void setSelected(boolean) boolean isSelected() | Selecciona u obtiene si el botón está seleccionado. Tiene sentido sólo en botones que tienen un estado on/off, como los checkbox.
> void doClick() void doClick(int) | Programáticamente realiza un "click". El argumento opcional especifica el tiempo (en milisegundos) que el botón debería estar pulsado.

#### Ejemplos que utilizan Botones

> Los siguientes ejemplos utilizan objetos JButton. Para ejemplos de otros tipos de botones, puedes ver las secciones de check boxes, radio buttons, y menus. También puedes ver la sección tool bar, que describe cómo añadir objetos JButton a un JToolBar.

> Ejemplo | Dónde se describe | Notas
> --- | --- | ---
> ButtonDemo.java | Esta página. | Utiliza mnemónicos e iconos. Especifica la posición del texto del botón, relativa al icono. Utiliza comandos action.
> AppletDemo.java | Ejecutar un Applet Swing | El mismo ejemplo de esta página, pero implementado en un applet.
> ListDialog.java | Cómo usar BoxLayout | Implementa un diálogo con dos botones, uno que es el botón por defecto.
> DialogDemo.java | Cómo crear Dialogs | Tiene botones "Show it" cuyo comportamiento imita el estado de los botones de radio. Utiliza clases internas para implementar el oyente de action.
> ProgressBarDemo.java | Cómo usar Progress Monitor | Implementa el oyente de action con una clase interna.

Ozito