Acciones y más acciones

Hoy nos vamos a ocupar de las “Action” de Java aplicadas a Swing.
Las Action nos ayudan a realizar, valga la redundancia, acciones sobre distintos elementos Swing. Vamos a concentrarnos en entrada de teclado.

Primer ejemplo, lectura del carácter ESCAPE para cerrar nuestra aplicación.

Para empezar deberíamos tener la ventana principal(el JFrame sobre el que trabajamos) en un SingletonHolder.

private static VentanaPrincipal _ventana;
public static VentanaPrincipal getInstance(){ return _ventana;}

De esta manera podremos acceder a él más adelante.

Ahora vamos a asignar 2 valores al panel principal de nuestra ventana. En el constructor de nuestra clase deberíamos hacer:

        getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).
                put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "CERRAR");
        getRootPane().getActionMap().put("CERRAR", new AbstractAction()
        {
            @Override
            public void actionPerformed(ActionEvent ae)
            {
                _ventana.dispose();
            }
        });

Esto hará que cuando pulsemos ESCAPE se cierre la ventana. Notar que el 0 en

put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0)

sirve para controlar el pulsado de teclas como ALT, CONTROL y SHIFT

Ahora voy a exponer otro ejemplo, abrir otra ventana con la combinación Control + K:

        getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).
                put(KeyStroke.getKeyStroke(KeyEvent.VK_K,
                    KeyEvent.CTRL_DOWN_MASK), "KONSOLE");
        getRootPane().getActionMap().put("KONSOLE", new AbstractAction()
        {
            @Override
            public void actionPerformed(ActionEvent ae)
            {
                _ventanaKonsole.setVisible(!_ventanaKonsole.isVisible());

            }
        });

Ahora siempre que pulsemos la combinación de teclas la nueva ventana se abrirá o cerrará.

¿Qué más cosas podemos hacer con las Action? Podemos usarla como Binding Keys.
Para ello tenemos que tener creado un boton:

Button jb1 = new JButton();

Una vez que lo hemos creado vamos a crear y asociar una acción.
Primero creamos una clase que implemente nuestra acción:

    private class addAction
            extends AbstractAction
    {
        public addAction(String text, String desc, Integer mnemonic)
        {
            super(text);
            putValue(SHORT_DESCRIPTION, desc);
            putValue(MNEMONIC_KEY, mnemonic);
        }

        public void actionPerformed(ActionEvent e)
        {
            System.out.println("Add action is running");
        }
    }

Se puede observar que le añadido más cosas que antes a esta nueva Action. Le he añadido una regla mnemotécnica. Esto lo que hará será que podamos “pulsar” el botón usando la combianción “ALT + TECLA”, además de subrayar la letra asociada a la tecla si esta diponible(ahora entederás esto).

Por último creamos y asociamos la Action:

 addAction _addAction = new addAction("Add",
               "Marca un archivo para ser subido al repositorio.", new Integer(KeyEvent.VK_A));
jb1.addAction(_addAction);

Si os fijais la letra “A” será la tecla para la combinación “ALT + TECLA” antes mencionada, por lo que en nuestro botón la letra A estará subrayada.
También podemos crear la Action primero y luego usar el constructor de JButton para asociarlo:

JButton jb1 = new JButton(_addAction);

Espero que os haya servido de ayuda.