为什么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的:

java - Java Swing keyEvent与keyPressed/keyReleased-不同的键码?-LMLPHP

java - Java Swing keyEvent与keyPressed/keyReleased-不同的键码?-LMLPHP

最佳答案

没有不同的键码。使用和不使用Ctrl时,“ A”键生成的键码为65。按下Ctrl时的不同之处在于,您从getKeyChar()获得的字符。正如它应该。

不,您得到的字符不是“各种null字符”,它是具有ASCII代码1的Ctrl+A字符,并且无法打印。但是它在那里。您只是看不到它,因为它是不可打印的。

不论是否按下KeyTypedCtrl始终将键代码报告为0。对于keyCode事件,未定义KeyEvent类的KeyTyped成员。它们只是在重用相同的事件类,因此getter仍然可供您调用,但您不应这样做,因为当事件为keyCode时,您永远不会获得KeyTyped信息。如果需要keyCode,请查看keyPressed事件。如果需要字符,请查看keyPressedkeyTyped事件。

07-26 09:35