击键捕捉。 ctrl使KeyChar属性为空

时间:2013-10-24 09:43:43

标签: java

我有一段代码可以捕获按键并使用System.out.println打印它们。我的问题是,当我尝试使用 ctrl (例如 ctrl + m )时,它会删除 m的KeyChar属性键。有谁知道为什么会发生这种情况以及如何解决它?

       public TestForm() {
        initComponents();
KeyEventDispatcher keyEventDispatcher = new KeyEventDispatcher() {
  @Override
  public boolean dispatchKeyEvent(final KeyEvent e) 
  {
    if (e.getID() == KeyEvent.KEY_PRESSED && e.isAltDown())
        {
         System.out.println("ALT + "+e.getKeyChar());   
        }
    else if (e.getID() == KeyEvent.KEY_PRESSED && e.isShiftDown())
        {
            System.out.println("SHIFT + "+e.getKeyChar());
        }
    else if (e.getID() == KeyEvent.KEY_PRESSED && e.isControlDown())
        {
             System.out.println("CTRL + "+e.getKeyChar()/*+"\n"+e*/);
        }   
    else
    {
        System.out.println(e);
    }
            return      true;   
        }
  };


KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(keyEventDispatcher)

;        
}

我对java很新,所以它可能是一些简单的东西。提前致谢

1 个答案:

答案 0 :(得分:3)

密钥代码和密钥字符之间存在重要差异。键码代表键盘上的键。键字代表某些字母表中的字母。键盘上有一个 ctrl 键,但 ctrl 的任何字母都没有字母(例如没有unicode字符)。因此,当按下 ctrl 键时,您将获得一个KEY_PRESSED事件,其中包含一个键代码,但没有键字符。

但并非所有希望都失去了。看起来你正试图检测何时 CTRL 并按下某个字符(例如,如果我键入 ctrl + A 而不是 A )。问题是您正在查看KEY_PRESSED事件。在Java中,KEY_PRESSED事件和KEY_TYPED事件之间存在重要区别。

例如,如果我在键盘上按 Ctrl + A ,我会先按下 Ctrl 键,然后按下 A 键,然后或多或少地同时释放它们。在我看来,我认为这是一个动作,但事实并非如此。 Java中会发生什么:

KEY_PRESSED (keyCode = VK_CTRL, keyChar = CHAR_UNDEFINED) //I press down Ctrl key
KEY_PRESSED (keyCode = VK_A, keyChar = CHAR_UNDEFINED) //I press down the a key
KEY_TYPED (keyCode = VK_UNDEFINED, keyChar = 'A') //The 'typing' of the letter 'A'
//some key released events that are not relevant to this discussion

正如您所看到的,KEY_PRESSED事件具有键代码但没有键字符(当按下键盘上的键时会触发)。 KEY_TYPED事件具有键char但不是键代码(这表示键序列的完成导致字母)。

所有这些都在KeyEvent页面的javadocs上详细记录。