## Cómo usar Actions

Si tenemos dos o más componentes que realizan la misma funcion, podemos considerar la utilización de un objeto Action para implementar la función. Un objeto Action es un ActionListener que no sólo proporciona manejo de eventos, sino que también centraliza el manejo de texto, iconos, y estados de enable de tool bar buttons o itéms de menu. Añadiendo un Action a un JToolBar, JMenu, o un JPopupMenu, obtendremos las siguientes características:

- Un nuevo JButton (para JToolBar) o JMenuItem (para JMenu y JPopupMenu) que se añade automáticamente a la barra de herramientas o menú. El botón o ítem de menú usa automáticamente el icono y el texto especificado por Action.
- Un oyente de action registrado (el objeto Action) para el botón o el ítem de menú.
- Manejo centralizado para el estado del botón o ítem de menú.

Aquí hay un ejemplo de uso de un Action para crear un botón de una barra de herramientas y un ítem de menú que realizan la misma función:

    Action leftAction = new <a class that implements Action>(...);
    JButton button = toolBar.add(leftAction);
    JMenuItem menuItem = mainMenu.add(leftAction);

Para que un botón o un ítem de menú obtengan todo el beneficio de usar un Action, debemos crear el componente usando el método add(Action) de JToolBar, JMenu, o JPopupMenu. Actualmente no existe ningún API que permita conectar un objeto Action con un componente ya existente. Por ejemplo, aunque podamos añadir un objeto Action como oyente de action de cualquier botón, el botón no será notificado cuando la acción esté deshabilitada.

Para crear un objeto Action, generalmente se crea una subclase de AbstractAction y luego se ejemplariza. En nuestra subclase debemos implementar el método actionPerformed para reaccionar de forma apropiada cuando ocurra el evento action. Aquí hay un ejemplo de creacción y ejemplarización de una sublcase AbstractAction:

    leftAction = new AbstractAction("Go left",
                                    new ImageIcon("images/left.gif")) {
        public void actionPerformed(ActionEvent e) {
            displayResult("Action for first button/menu item", e);
        }
    };

Aquí tenemos una imagen de la aplicación que usa actions para implementar características de árbol:

> Prueba esto:
> 1. Compila y ejecuta la aplicación. El fichero fuente es ActionDemo.java. También necesitarás tres ficheros de imágenes: left.gif, middle.gif, y LEFT.gif.
> 2. Elige el ítem superior del menú de la izquierda(Menu->Go left).
>    El área d etexto muestra algún texto identificando tanto la fuente del evento como el oyente que lo ha recibido.
> 3. Pulsa el botón más a la izquierda de la barra de herramientas.
>    De nuevo el área de texto muestra información sobre el evento. Observa que aunque la fuente del evento sea diferente, ambos eventos fueron detectados por el mismo oyente de action: el objeto Action con el que se creó el componente.
> 4. Elige el ítem superior del menú Action State.
>    Esto desactiva el objeto Action "Go Left", que desactiva sus objetos asociados, el botón y el ítem de menú.

Aquí está lo que ve el usuario cuando la acción "Go left" está desactivada:

Aquí está el código que desactiva la acción "Go left":

    boolean selected = ...//true if the action should be enabled; false, otherwise
    leftAction.setEnabled(selected);

Después de crear nuestros componentes usando un Action, podríamos necesitar personalizarlos. Por ejemplo, podríamos querer seleccionar el texto del tool-tip del botón. O podríamos personalizar la apariencia de uno de los componentes añadiendo o borrando el icono o el texto. Por ejemplo, ActionDemo.java no tiene iconos en sus menús, ni texto en sus botones, ni tool-tips. Aquí está el código que consigue esto:

    button = toolBar.add(leftAction);
    button.setText(""); //an icon-only button
    button.setToolTipText("This is the left button");
    menuItem = mainMenu.add(leftAction);
    menuItem.setIcon(null); //arbitrarily chose not to use icon in menu

#### El API de Action

> Las siguientes tablas listan los métodos y constructores más usados de Action. El API para usar objetos Action se divide en dos categorías:
> - Crear y usar un Action
> - Crear un Componente Controlado por un Action

> Crear y usar un Action
> Método o constructor | Propósito
> --- | ---
> AbstractAction() AbstractAction(String) AbstractAction(String, Icon) | Crea un objeto Action. A través de los argumentos, podemos especificar el texto y el icono usados en los componentes que controla el action.
> void setEnabled(boolean) boolean isEnabled() | Selecciona u obtiene si los componetes que controla el actión están activados. Llamanado a setEnabled(false) se desactivan todos los componentes que controla. De forma similar, llamando a setEnabled(true) se activan todos los componentes del action.

> Crear un Componnete Controlado por un Action
> Método | Propósito
> --- | ---
> JMenuItem add(Action) JMenuItem insert(Action, int) (en JMenu y JPopupMenu) | Crea un objeto JMenuItem y lo pone en el menú. Puedes ver la sección Cómo usar Menus para más detalles.
> JButton add(Action) (in JToolBar) | Crea un objeto JButton y lo pone en la barra de herramientas. Puedes ver la sección Cómo usar Tool Bars para más detalles.

#### Ejemplos que usan Actions

> Actualmente, el único ejemplo que usa objetos Action es ActionDemo.java, que se usa y se describe en esta página.

Ozito