1

当我按下任意键时,我会收到 3 个事件:KeyPressed、KeyTyped 和 KeyReleased。对于 KeyPressed 和 KeyReleased,它知道密钥来自哪里,例如 KeyPad。但是,对于 KeyTyped 事件,它似乎失去了它来自键盘的所有知识。知道为什么吗?

这是我按键盘上的 4 键时的一些 toString:

java.awt.event.KeyEvent[KEY_TYPED,keyCode=0,keyText=Unknown keyCode: 0x0,keyChar='4',keyLocation=KEY_LOCATION_UNKNOWN

如果 KeyPressed 和 KeyReleased 来自键盘,我可以使用它,但我需要对 KeyTyped 执行相同操作:

@Override
public boolean dispatchKeyEvent(KeyEvent keyEvent) {
    if (keyEvent.getKeyLocation() == KeyEvent.KEY_LOCATION_NUMPAD){
        keyEvent.consume();
        return true;
    } 
    return false;
}

所以我的问题是如果它来自键盘,我如何阻止它发出 KeyTyped 事件?

谢谢,

4

1 回答 1

1

文档说:

被按下或释放的键的位置。始终为 KEY_TYPED 事件返回 KEY_LOCATION_UNKNOWN。

原因是KEY_TYPED事件是一种逻辑事件,它们只是告诉您输入了一个键,而忽略了它是如何输入的低级细节。例如:在文本编辑器中,您只是不需要知道键是如何输入的或字符是如何生成的。对于此类应用程序,尝试了解它通常被认为是一个非常糟糕的主意。

KEY_PRESSED并且KEY_RELEASED是更多的物理事件。例如:在游戏中,当产生释放或按下时,您可能想做不同的事情:按下>>>开始运行,释放>>>>停止运行。因此,知道使用了哪个物理键可能会很有趣,因为您对事件的细节和键盘布局更感兴趣。

于 2013-01-29T15:08:37.357 回答