18

我在 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()));
} 

我添加了一个printlnevt查看会发生什么并验证我的 keylistener 是否有效。当我构建并运行我的应用程序时,我意识到输出似乎总是有一个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。

4

3 回答 3

32

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

KeyEvent API:

“按键类型”事件是更高级别的,通常不依赖于平台或键盘布局。它们是在输入 Unicode 字符时生成的,并且是查找字符输入的首选方式......

对于按键按下和按键释放事件,getKeyCode 方法返回事件的 keyCode。对于键类型事件,getKeyCode 方法总是返回 VK_UNDEFINED。

于 2013-02-05T19:07:06.760 回答
3
于 2013-02-05T19:15:57.780 回答
0

这很大程度上取决于已按下的键。可能您需要KeyListener使用keyPressed方法覆盖,因为keyTyped不会在不可打印的字符上触发。

keyTyped看看和这里的区别keyPressedKeyListener, keyPressed vs keyTyped

于 2013-02-05T19:08:23.717 回答