KeyTypedEvent中的KeyEvent的KeyCode始终为0?

19

我在NetBeans IDE中有一个Java Swing应用程序。

我制作了一个表格,并将KeyListener附加到我的各个控件上:

    jButton1.addKeyListener(new java.awt.event.KeyAdapter() {
        public void keyTyped(java.awt.event.KeyEvent evt) {
            keyTypedEvent(evt);
        }
    });

keyTypedEvent 定义如下:

private void keyTypedEvent(java.awt.event.KeyEvent evt) 
{                               
System.out.println(evt);
appendDisplay(String.valueOf(evt.getKeyChar()));
} 

我在evt中加入了一个println以查看发生了什么并验证我的按键监听器的功能。

当我构建和运行应用程序时,我意识到输出似乎总是有keycode = 0

为了验证这一点,我将我的println更改为evt.getKeyCode(),并且它总是返回0。

我可能完全误解了KeyCode的作用,但我认为它应该与Oracle文档中的值相对应:http://docs.oracle.com/javase/7/docs/api/constant-values.html#java.awt.event.KeyEvent.VK_ESCAPE。例如,VK_ESCAPE的值为27。


不要使用KeyListener。请使用DocumentListener或Swing Key bindings。 - Guillaume Polet
3个回答

33

keyTyped() 事件仅用于生成字符输入的按键。如果您想要知道何时按下或释放任何键,您需要实现keyPressed()keyReleased()

来自KeyEvent API:

"Key typed"事件是高级别的事件,通常不依赖于平台或键盘布局。它们在输入Unicode字符时生成,并且是了解字符输入的首选方式....

对于按下和释放的键事件,getKeyCode方法返回事件的keyCode。对于"key typed"事件,getKeyCode方法始终返回VK_UNDEFINED。


3

0

它非常取决于按下的键。可能需要使用带有 keyPressed 方法覆盖的 KeyListener,因为 keyTyped 不会在非可打印字符上触发。

请看这里 keyTypedkeyPressed 之间的差异: KeyListener, keyPressed versus keyTyped


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接