击键捕获.ctrl 使键字符属性为空

  • 本文关键字:属性 字符 ctrl 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 很陌生,所以它可能只是我缺少的简单东西。提前致谢

键代码和键字符之间有一个重要的区别。 键代码表示键盘上的键。 键字符表示某个字母表中的字母。 键盘上有一个 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 中。

最新更新