2010-11-21 19 views
9

En SWT le puede dar cualquier botón de tecla de atajo simplemente añadiendo & delante de la letra en la etiqueta del botón. Por ejemplo, si la etiqueta de mi botón es &Play, puedo activar el botón presionando la letra p en el teclado.Tecla de método abreviado para JButton sin utilizar la tecla alt

En Swing, se puede añadir una tecla de acceso directo utilizando la propiedad mnemonic. Sin embargo, debe presionar alt+p para activar el botón. Esto es realmente más apropiado para atajos de menú. Quiero activar el botón con una letra presionada y sin modificador alternativo.

que he visto este post sobre cómo hacerlo, pero parece absurdamente complicado. ¿Hay alguna forma más fácil de hacer esto?

http://linuxjavaprogrammer.blogspot.com/2008/01/java-swing-jbutton-keyboard-shortcuts.html

actualización : Después @camickr sugerencia, que terminé usando este código. No pude encontrar ningún ejemplo claro y simple en línea, así que con suerte esto ayudará a la gente.

// play is a jButton but can be any component in the window 
play.getInputMap(play.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_P, 0), "play"); 
play.getActionMap().put("play", new AbstractAction() { 
public void actionPerformed(ActionEvent e) { 
    playActionPerformed(e); // some function 
} 
}); 

Respuesta

5

Sí, Swing fue diseñado para utilizar Key Bindings. Entonces, en lugar de agregar un ActionListener al botón, agrega una Acción. Entonces esa Acción puede ser compartida por el botón o un elemento del menú. También puede asignar cualquier cantidad de KeyStrokes para invocar la Acción usando KeyBindings. El tutorial también tiene una sección sobre Acciones que explica por qué usar una Acción es beneficioso.

JComponent tiene un método registerKeyboardAction (...) que básicamente hace los enlaces de InputMap/ActionMap para usted, pero también tiene que ajustar el ActionListener en una acción de envoltura para que sea preferible que tenga sus propios enlaces.

0

He tenido un problema similar con una forma dinámica construida (basada en la entrada de datos) y acaba de terminar adjuntando una acción keyListener a los botones. En la construcción de formularios, analizo el árbol de componentes para los botones y adjunto el oyente. El oyente también analiza el árbol e iguala la pulsación de la tecla con el botón apropiado (a través del texto en el botón), ya que no tengo idea de cuál tendrá foco en un momento dado, y dispara el botón doCick ... Es feo, siente hacker, y tiene que ser un procesador poco intensiva, pero permite la flexibilidad que necesito para esta forma dinámica particular ...

1

con la respuesta de camickr, ahora estoy utilizando una función de utilidad poco como esto:

public static void clickOnKey(
    final AbstractButton button, String actionName, int key) 
{ 
    button.getInputMap(JButton.WHEN_IN_FOCUSED_WINDOW) 
     .put(KeyStroke.getKeyStroke(key, 0), actionName); 

    button.getActionMap().put(actionName, new AbstractAction() 
    { 
     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
      button.doClick(); 
     } 
    }); 
} 

Ahora para configurar el atajo de teclado para un botón acabo de hacer:

clickOnKey(playButton, "play", KeyEvent.VK_P); 
Cuestiones relacionadas