2010-03-10 12 views
6

Dans le programme suivant, pourquoi frapper la une touche d'impression « bonjour, monde » tout en frappant CTRL +un ne fonctionne pas?Java Swing KeyStrokes: comment rendre le travail modificateur CTRL

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); 
    } 
} 

Comment pourrais-je réparer que CTRL +un fonctionne aussi bien?

Répondre

15

Je trouve plus facile à utiliser:

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

ou:

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

Mec, utilisez ce

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

Mec, merci! Votre solution fonctionne, mais je me demande encore pourquoi la mienne ne ... – Thomas

+0

Intéressant J'ai fait ma suggestion avant cette publication, et je vous ai donné d'autres alternatives que vous pourriez utiliser dans différentes situations. Je suppose que je ne vais pas aller à tous les ennuis la prochaine fois. – camickr

+1

@Thomas: Je ne sais pas si j'ai raison, mais la raison pour laquelle votre code n'a peut-être pas fonctionné car dans le premier cas, vous faisiez référence à un simple caractère 'a'. Dans le second cas, vous faites référence à une combinaison de touches ASCII et une valeur de balayage (touche Ctrl). Je pense qu'il aurait dû être associé aux événements correctement. – bragboy

-1

Eh oui, le code ci-dessus fonctionnera.

image Big - Ctrl + a et un sont lus comme différentes frappes les mêmes que un et b serait différent.

+5

L'OP sait que "Ctrl-A" et "A" sont des frappes différentes. – camickr