Java KeyListener给了我“Unknown keyCode:0x0”

时间:2010-10-20 15:06:08

标签: java event-handling

class KeyDemoFrame extends JFrame implements KeyListener
{
    String line1;
    KeyDemoFrame()
    {

        setTitle("hello");
        setSize(200,200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        addKeyListener(this);
    }

    public void keyTyped(KeyEvent e) {
        line1 = e.getKeyText(e.getKeyCode());
        JOptionPane.showMessageDialog(null, e.getKeyCode());
        JOptionPane.showMessageDialog(null, e.getKeyText(e.getKeyCode()));

    }

    public void keyPressed(KeyEvent e) {
    }

    public void keyReleased(KeyEvent e) {
    }
}

当我按任意键时,第一个消息对话框的“0”和第二个消息对话框的“Unknown keyCode:0x0”。

我做错了什么?

6 个答案:

答案 0 :(得分:2)

您似乎将非美国版面作为默认布局。 Java不喜欢它并生成带有无效密钥代码的事件。作为对策,您可以为美国分配主要布局。

答案 1 :(得分:1)

使用e.getKeyChar()

答案 2 :(得分:1)

您需要在KeyCode事件中获取KeyPressed然后您可以在KeyTyped中使用它,当然您将使用的变量必须在这两个事件之外声明。

答案 3 :(得分:0)

我认为你还需要这个来捕捉这个事件:

/**
     * Notification that an event has occured in the AWT event
     * system
     * 
     * @param e Details of the Event
     */
    public void eventDispatched(AWTEvent e) {
        if (e.getID() == KeyEvent.KEY_PRESSED) {
            keyPressed((KeyEvent) e);
        }
        if (e.getID() == KeyEvent.KEY_RELEASED) {
            keyReleased((KeyEvent) e);
        }
        if (e.getID() == KeyEvent.KEY_TYPED) {
            keyTyped((KeyEvent) e);
        }
    }

答案 4 :(得分:0)

来自KeyEvent

}的

的Java文档
  

getKeyCode
  返回:键盘上实际键的整数代码。 (对于KEY_TYPED事件,keyCode为VK_UNDEFINED。)

您正在使用keyTyped事件,因此返回的值为VK_UNDEFIED。

但是,您可以使用以下内容来获取键入的字符:

JOptionPane.showMessageDialog(null, e.getKeyChar());

答案 5 :(得分:0)

您可能会收到三种类型的事件:KEY_PRESSEDKEY_RELEASEDKEY_TYPED事件。前两个与键盘上按下和释放键的操作相关联(可能会或可能不会导致输入字符),而第三个与字符输入相关联:

  • 对于KEY_PRESSEDKEY_RELEASED事件:
    • e.getKeyCode()会返回有效的密钥代码
    • e.getKeyChar()返回CHAR_UNDEFINED
  • 对于KEY_TYPED个事件:
    • e.getKeyChar()返回有效的Unicode字符
    • e.getKeyCode()返回VK_UNDEFINED

您的代码正在监听KEY_TYPED个事件,但之后使用的e.getKeyCode()仅对KEY_PRESSEDKEY_RELEASED个事件有效。