1

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

       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很陌生,所以我可能缺少一些简单的东西。提前致谢

4

1 回答 1

3

关键代码和关键字符之间有一个重要区别。键码代表键盘上的一个键。一个键字符代表某个字母表中的一个字母。您的键盘上有一个ctrl键,但没有任何字母表中的字母(例如,没有 Unicode 字符)ctrl。因此,当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 事件有一个键字符,但没有键代码(这表示一个键序列的完成,产生一个字母)。

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

于 2013-10-24T10:52:51.857 回答