Atajos de teclado en Swing

Generalmente en una aplicación es deseable que se pueda utilizar por completo con el teclado prescindiendo por completo del ratón. Esto en general agiliza el trabajo e incrementa la productividad del usuario de la aplicación. Además de que a gente como a mi, que estamos trabajando casi siempre con el portátil, en general para mi es una molestia tener que recurrir al touchpad, el cual en general es bastante incómodo sea el portátil que sea.

En Java Swing en general hay dos atajos de teclado diferente, los mnemonic que en general están relacionados con accesos directos a elementos de la interfaz (menús, botones, etc.) y luego los atajos de teclado, que nos permiten invocar determinadas acciones directamente. Normalmente las aplicaciones entre si suelen mantener unos atajos de teclado comunes. Es deseable por ejemplo que Guardar sea Ctrl+S (o Ctrl+G en caso de que los atajos estén internacionalizados), o que por ejemplo cerrar una pestaña sea Ctrl+W o que eliminar un elemento de una vista de iconos o de una vista en lista Supr elimine un elemento. Veamos como se hace para definir atajos de teclado en JAVA Swing.

Mnemónicos en Swing

En principio voy a explicar como se añaden a través de código, aunque si estás trabajando con NetBeans hay un método muy sencillo de definir un Mnemónico a través de las propiedades del elemento en el que lo queramos definir. Aún así eso se definirá de una manera bastante simple en código.

Generalmente cuando definimos un botón podemos definir un mnemónico, esto se aplica de la misma manera para cualquier elemento que tenga un label, para que este adquiera el foco o lance la Action. Una cosa que debe de ocurrir a la hora de definir un mnemónico (que poco me gusta este nombre) es que el caracter que se defina como tal debe estar contenido en la cadena del Label del elemento donde lo estamos definiendo. En caso contraría no valdría para nada. Por eso en general es de interés que el mnemónico se defina dinámicamente según el lenguaje en el que esté la aplicación.

Para el tema de los mnemónicos internacionalizables en general es interesante estar trabajando con Swing Application Framework, para tener la facilidad de acceso a las cadenas de traducción a través del ResourceMap, con el que me imagino que si estais trabajando con SAF estareis familiarizados.

javax.swing.ActionMap actionMap =
    org.jdesktop.application.Application.getInstance(gnulab.GNULabApp.class).
    getContext().getActionMap(DoctorAnalysisView.class, this);
jButton2.setAction(actionMap.get("saveAnalysis")); // NOI18N        jButton2.setMnemonic(
    java.util.ResourceBundle.getBundle("gnulab/doctorgui/resources/DoctorAnalysisView").
    getString("saveAnalysis.Action.text").charAt(0));

Como veis en esta cadena tras enlazar la acción con el botón, podemos definir un mnemónico a traves del método setMnemonic utilizando el ResourceBundle para obtener la cadena que realmente tendrá el label del botón y decirle que el mnemónico será el primer caracteres de ese label.

En caso de que estemos trabajando sin Swing Application Framework, podemos definir a mano el caracter. A través de algo tan simple como esto.

JButton button1 = new JButton("Warning");
button1.setMnemonic(KeyEvent.VK_W);

Si estamos trabajando con NetBeans y estamos usando el Swing Application Framework la idea viene siendo más fácil…

Primero sería botón derecho sobre el botón donde queremos definir el mnemónico, en el menú nos vamos a propiedades.

Screenshot1 Atajos de teclado en Swing

A continuación vamos a editar la propiedad mnemonic pulsando en el botoncito pequeño que tiene tres puntitos o doble click sobre la celda editable.

Screenshot 1 Atajos de teclado en Swing

Con esto nos saldrá una ventana donde tendremos que seleccionar el fichero de propiedades donde está la cadena de texto del label del elemento, seleccionar que cadena de texto queremos en concreto y añadirlo. Si nos fijamos, abajo en el campo Code que no es editable el final acaba en una llamada al método charAt, si copiais esto y en lugar de seleccionar internazionaliced mnemonic podreis seleccionar Custom Code, pegar eso y cambiar el índice del charAt, por si os interesa que en lugar de ser el primer caracter de la cadena sea otro.

Screenshot 2 Atajos de teclado en Swing

Al acabar de hacer en el editor visual vereis que el primer caracter ahora está subrayado, eso quiere decir que todo ha ido bien. Pero ojo, si editais manualmente la cadena con Custom Code, entonces lo que ocurrirá es que en el editor visual no actualizará eso. Pero tranquilos, si haceis el build del proyecto y lo ejecutais vereis que está todo en orden.

Atajos de teclado

Los atajos de teclado enlazados a acciones directamente se definen generalmente de una manera un poco diferente. Estos deben estar definidos para un panel en general, de manera que sólo funcionen cuando ese panel tenga el foco o alguno de sus hijos tenga el foco.

La idea es como vereis en el código que muestro a continuación es bastante más simple que con los mnemónicos.

Action scroll; // Accion que se utilizará con el atajo de teclado.
JPanel panel; // Panel en donde se registrará el atajo de teclado.

// Se define el atajo de teclado
KeyStroke up = KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_UP);

// Por último registramos el atajo de teclado y la acción que va a lanzar en el panel.
panel.registerKeyboardAction(scroll, "lineup", up,
                             JComponent.WHEN_ANCESTOR_OF_FOCUSED_WINDOW);

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>