Java Swing keyEvent vs keyPressed / keyReleased - 不同的密钥代码?

时间:2017-08-02 13:40:31

标签: java swing events

为什么keyTyped会将不同的KeyEvent返回给keyPressed / keyReleased?

package poke;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;

public class PokeEvents implements KeyListener {
    static public void main(String args[]) {
        new PokeEvents();
    }

    public PokeEvents() {
        JFrame frame = new JFrame();
        frame.addKeyListener(this);
        frame.setVisible(true);
    }

    @Override
    public void keyTyped(KeyEvent e) {
        System.err.println("keyTyped: "+e.getKeyCode()+", "+e.getKeyChar()+", "+e.getExtendedKeyCode());
    }

    @Override
    public void keyPressed(KeyEvent e) {
        System.err.println("keyPressed: "+e.getKeyCode()+", "+e.getKeyChar()+", "+e.getExtendedKeyCode());
    }

    @Override
    public void keyReleased(KeyEvent e) {
        System.err.println("keyReleased: "+e.getKeyCode()+", "+e.getKeyChar()+", "+e.getExtendedKeyCode());
    }

}

运行它,按键盘上的'a',输出为:

keyPressed: 65, a, 65
keyTyped: 0, a, 0
keyReleased: 65, a, 65

好吧,你说,似乎无害。让我们赌一把。尝试将它与Ctrl结合使用(我们的软件中的原始错误暴露了这个问题,处理了Ctrl键组合)。

keyPressed: 17, , 17
keyPressed: 65, , 65
keyTyped: 0, , 0
keyReleased: 65, , 65
keyReleased: 17, , 17

请注意:17 - 控制,65 - a。

keyTyped上,无法知道角色是什么。它似乎是各种各样的null字符。

由于角色未在浏览器中呈现,因此按照编辑器和Eclipse中的说明:

output as pasted in the SO editer

Output as seen in Eclipse console

1 个答案:

答案 0 :(得分:3)

没有不同的密钥代码。使用和不使用Ctrl时,“A”键生成的密钥代码为65.按下Ctrl时的不同之处是您从getKeyChar()获得的字符。应该如此。

不,你得到的角色不是“一个null字符”,它是Ctrl+A字符,ascii代码1,并且它是不可打印的。但它就在那里。你只是没有看到它,因为它是,嗯,好,不可打印。

KeyTyped始终为关键代码报告0,无论是否按下CtrlkeyCode类的KeyEvent成员未定义KeyTyped事件。他们只是重复使用相同的事件类,所以getter仍然可供您调用,但您不应该这样做,因为当事件为keyCode时,您永远不会获得KeyTyped信息。如果您想要keyCode,请查看keyPressed事件。如果您想要角色,请查看keyPressedkeyTyped个事件。