2009-12-22 6 views
8

Tengo un problema con setAccelerator(). En este momento, tengo el código que funciona para Ctrl + X para la operación DELETE. Quiero configurar el acelerador en Mayús + Eliminar también para el mismo JMenuItem.¿Se pueden definir aceleradores múltiples para un JMenuItem?

Mi código de la siguiente manera:

JMenuItem item = new JMenuItem(menuText); 
item.setAccelerator(KeyStroke.getKeyStroke(
    KeyEvent.VK_X, KeyEvent.CTRL_MASK)); 
item.setAccelerator(KeyStroke.getKeyStroke(
    KeyEvent.VK_DELETE, KeyEvent.SHIFT_MASK)); 

pero esto está trabajando sólo para Shift + Supr operación. Parece que está anulando la operación Ctrl + X. ¿Podemos hacer que estas dos pulsaciones de teclas funcionen al mismo tiempo?

Por favor guía.

Respuesta

3

Desde: http://java.sun.com/j2se/1.4.2/docs/api/java/awt/AWTEvent.html

Las máscaras también se utilizan para especificar a qué tipos de eventos un AWTEventListener deben escuchar.

Para que pueda combinar la máscara para dos teclas, pero no para KeyEvents.

item.setAccelerator( 
    KeyStroke.getKeyStroke(
     KeyEvent.VK_X, KeyEvent.CTRL_MASK + KeyEvent.SHIFT_MASK)); 

Una solución solución sería coger el KeyEvent en el medio (después de su componente disparó, pero antes de que sus oyentes actuar sobre ella) y comprobar, si es una de las dos combinaciones. Luego activa un evento, en el cual aceptas programáticamente representar la acción que deseas.

+0

Debería ser un OR en lugar de un PLUS: 'KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK' – MondKin

0

La segunda llamada anula el acelerador. Si el método comienza con el conjunto, solo habrá uno. Si el método comienza con agregar, puede tener más de uno (por ejemplo, para un número de oyentes).

Si desea que varias pulsaciones de teclas hagan lo mismo, creo que debería agregar un KeyListener al marco superior (o panel, diálogo, ...) que invoca los oyentes de acción agregados al elemento de menú.

7

Sí se puede hacer. Detrás de escena, el setAccelerator() solo está creando un enlace de clave, sin embargo, como notó, el segundo enlace reemplaza al primero.

Por lo tanto, debe crear una Acción (no un ActionListener) para agregar el elemento al menú. Lea la sección del tutorial de Swing en How to Use Actions para obtener más información. Ahora que ha creado la acción, puede compartir la acción con otra pulsación de tecla creando manualmente una vinculación de clave. Puede leer la sección del tutorial de Swing en How to Use Key Bindings para una explicación detallada. O puede leer mi blog en Key Bindings que proporciona algunos ejemplos de código simple.

Este segundo enlace no aparecerá en el elemento del menú.

Cuestiones relacionadas