为什么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的:
最佳答案
没有不同的键码。使用和不使用Ctrl
时,“ A”键生成的键码为65。按下Ctrl
时的不同之处在于,您从getKeyChar()
获得的字符。正如它应该。
不,您得到的字符不是“各种null
字符”,它是具有ASCII代码1的Ctrl+A
字符,并且无法打印。但是它在那里。您只是看不到它,因为它是不可打印的。
不论是否按下KeyTyped
,Ctrl
始终将键代码报告为0。对于keyCode
事件,未定义KeyEvent
类的KeyTyped
成员。它们只是在重用相同的事件类,因此getter仍然可供您调用,但您不应这样做,因为当事件为keyCode
时,您永远不会获得KeyTyped
信息。如果需要keyCode
,请查看keyPressed
事件。如果需要字符,请查看keyPressed
或keyTyped
事件。