2010-01-07 25 views
7

Tengo un elemento de menú, "rename", para el cual F2 está configurado como acelerador. De hecho, cuando se muestra el menú hay una pequeña indicación "F2" al lado de "cambiar el nombre".Swing: configuración de una tecla de función (F2) como acelerador

Lamentablemente, esto no funciona. Este acelerador no desencadena ninguna respuesta. Cuando cambio el acelerador a CTRL + F2, funciona.

Parece que debería usar un InpoutMpa/ActionMap. El problema es que quiero que esto funcione en todas partes en la aplicación, así que estoy tratando de asociarlo con el JFrame de nivel superior. Pero, JFrame no tiene un método getInputMap().

Perdido.

[Agregado]

 ks = KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0); 
    JMenuItem mi = new JMenuItem("Rename"); 
    mi.setAccelerator(ks); 
    mi.addActionListener(action); 
+1

Favor muestra la codificación se utiliza para establecer el acelerador! –

+3

¿Podría ser que su OS/administrador de ventana "consuma" la pulsación de tecla para que nunca llegue a su aplicación Swing (por ejemplo, porque F2 está asignado a algo especial, y Ctrl-F2 no lo está)? – netzwerg

Respuesta

4

Esto probablemente sucede porque JTable utiliza F2 para invocar la acción StartEditing (vi el mismo comportamiento en uno de mis programas y remontar a esto).

Hay un par de soluciones. La más drástica es eliminar esta asignación de entrada (creo que este código en realidad elimina el mapeo de todos los JTables):

KeyStroke keyToRemove = KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0); 

InputMap imap = table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 
while (imap != null) 
{ 
    imap.remove(keyToRemove); 
    imap = imap.getParent(); 
} 

O, si usted está utilizando la tabla sólo para mostrar y no pienso dejar al usuario editar, usted podría hacer que no centrada:

table.setFocusable(false); 

en un tema completamente diferente, recomiendo encarecidamente la creación de una subclase AbstractAction para sus elementos de menú, en lugar de crearlos "desde cero". Además de darle un código de configuración de menú muy simple, puede usar la misma instancia de acción para el menú principal y una ventana emergente/barra de herramientas, y habilitarlos/deshabilitarlos al mismo tiempo.

4

Sé que este es un hilo antiguo, pero luché con exactamente lo mismo que el póster original y encontré la solución. JFrame en sí no tiene un método getInputMap, pero sí su panel raíz. Entonces, debe usar "getRootPane.getInputMap" en su lugar. código

Ejemplo:

public class ApplicationFrame extends JFrame { 
    private AbstractAction f2Action = new AbstractAction() { 
     private static final long serialVersionUID = 1L; 

     public void actionPerformed(ActionEvent e) { 
      // Do something useful 
     } 
    }; 

    public ApplicationFrame() { 

     InputMap inputMap = getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 
     ActionMap actionMap = getRootPane().getActionMap(); 

     inputMap.put(KeyStroke.getKeyStroke("F2"), "f2Action"); 
     actionMap.put("f2Action", f2Action); 

    } 
} 
+1

hmm ... no creo que este enlace funcione cuando un acelerador de menú no lo hace. – kleopatra

+0

El acelerador es un enlace que se agrega en alguna parte. El problema es que algo a lo largo del árbol de componentes captura la pulsación de tecla antes de llegar al enlace. Resolví esto escribiendo un método que atraviesa todo un árbol de Contenedores y elimina la pulsación de teclas del mapa de entrada de cualquier JComponent que encuentre. –

Cuestiones relacionadas