为什么keyTyped会向keyPressed/keyReleased返回不同的KeyEvents?
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进行如下所示:
发布于 2017-08-02 13:43:52
没有不同的密钥代码。无论有没有Ctrl
,"A“键生成的密钥代码都是65。当按下Ctrl
时,不同之处在于您从getKeyChar()
获得的字符。这是应该的。
不,您得到的字符不是“一种null
字符”,它是ascii代码为1的Ctrl+A
字符,并且它是无法打印的。但它确实存在。你只是看不到它,因为它是,嗯,好吧,不能打印。
无论是否按下Ctrl
键,KeyTyped
都会始终报告键代码为0。未为KeyTyped
事件定义KeyEvent
类的keyCode
成员。它们只是重用了相同的event类,所以getter仍然可以供您调用,但您不应该这样做,因为当事件为KeyTyped
时,您永远不会获得keyCode
信息。如果您想要一个keyCode
,可以查看keyPressed
事件。如果您想要一个字符,可以查看keyPressed
或keyTyped
事件。
https://stackoverflow.com/questions/45462556
复制