2010-03-10 17 views
6

En el siguiente programa, ¿por qué no golpear el una clave de impresión"hola, mundo", mientras que golpearCTRL +un no?Java Pulsaciones de Swing: cómo hacer el trabajo CTRL-modificador

import java.awt.event.*; 
import javax.swing.*; 

public class KeyStrokeTest { 
    public static void main(String[] args) { 
     JPanel panel = new JPanel(); 

     /* add a new action named "foo" to the panel's action map */ 
     panel.getActionMap().put("foo", new AbstractAction() { 
       public void actionPerformed(ActionEvent e) { 
        System.out.println("hello, world"); 
       } 
      }); 

     /* connect two keystrokes with the newly created "foo" action: 
      - a 
      - CTRL-a 
     */ 
     InputMap inputMap = panel.getInputMap(); 
     inputMap.put(KeyStroke.getKeyStroke(Character.valueOf('a'), 0), "foo"); 
     inputMap.put(KeyStroke.getKeyStroke(Character.valueOf('a'), InputEvent.CTRL_DOWN_MASK), "foo"); 

     /* display the panel in a frame */ 
     JFrame frame = new JFrame(); 
     frame.getContentPane().add(panel); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(400, 400); 
     frame.setVisible(true); 
    } 
} 

¿Cómo podría solucionarlo que CTRL +un funciona tan bien?

Respuesta

15

Me resulta más fácil de usar:

KeyStroke a = KeyStroke.getKeyStroke("A"); 
KeyStroke controlA = KeyStroke.getKeyStroke("control A"); 

o:

KeyStroke controlA = KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK); 
6

Amigo, utilizar este

inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK), "foo"); 
+0

¡Amigo, gracias! Su solución funciona, sin embargo, todavía me pregunto por qué la mía no ... – Thomas

+0

Interesante Hice mi sugerencia antes de esta publicación, además le di otras alternativas que podría utilizar en diferentes situaciones. Supongo que no me tomaré la molestia la próxima vez. – camickr

+1

@Thomas: No sé si estoy en lo correcto, pero la razón por la que su código podría no haber funcionado es porque en el primer caso, se refería a un carácter simple 'a'. Where-in en el segundo caso se refiere a una combinación de claves que es un ASCII y un valor de escaneo (tecla Ctrl). Siento que debería haber estado asociado con los eventos adecuadamente. – bragboy

-1

Sí, el código anterior funcionará.

El panorama - Ctrl + A y un se leen como diferentes combinaciones de teclas lo mismo que un y b sería diferente.

+5

El OP sabe que "Ctrl-A" y "A" son teclas diferentes. – camickr