2010-03-10 9 views
6

Im folgende Programm zu machen, warum trifft den einen Taste Druck „Hallo, Welt“ während Schlagen CTRL +ein nicht?Java Swing KeyStrokes: wie CTRL-Modifikator Arbeit

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

Wie kann ich das Problem beheben, dass CTRL +ein auch funktioniert?

Antwort

15

Ich finde es einfacher zu bedienen:

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

oder:

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

Geck, benutzen Sie diese

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

Alter, danke! Ihre Lösung funktioniert, aber ich frage mich immer noch, warum meins nicht ... – Thomas

+0

Interessant Ich habe meinen Vorschlag vor diesem Posting gemacht, und ich habe Ihnen andere Alternativen gegeben, die Sie möglicherweise in verschiedenen Situationen verwenden können. Ich schätze, ich werde das nächste Mal nicht alle Probleme machen. – camickr

+1

@Thomas: Ich weiß nicht, ob ich richtig bin, aber der Grund, dass Ihr Code nicht funktioniert haben könnte, weil Sie im ersten Fall auf ein einfaches Zeichen "a" bezogen haben. Where-in im zweiten Fall beziehen Sie sich auf eine Kombination von Schlüsseln, die ein ASCII- und ein Scan-Wert ist (Strg-Taste). Ich denke, es sollte mit Ereignissen in Verbindung gebracht werden. – bragboy

-1

Yep, der obige Code funktioniert.

Big Bild - Strg + a und ein als unterschiedliche Tastenanschläge der gleichen wie ein und b wäre anders lesen.

+5

Das OP weiß, dass "Strg-A" und "A" verschiedene Tastenanschläge sind. – camickr