为什么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中的说明:
答案 0 :(得分:3)
没有不同的密钥代码。使用和不使用Ctrl
时,“A”键生成的密钥代码为65.按下Ctrl
时的不同之处是您从getKeyChar()
获得的字符。应该如此。
不,你得到的角色不是“一个null
字符”,它是Ctrl+A
字符,ascii代码1,并且它是不可打印的。但它就在那里。你只是没有看到它,因为它是,嗯,好,不可打印。
KeyTyped
始终为关键代码报告0,无论是否按下Ctrl
。 keyCode
类的KeyEvent
成员未定义KeyTyped
事件。他们只是重复使用相同的事件类,所以getter仍然可供您调用,但您不应该这样做,因为当事件为keyCode
时,您永远不会获得KeyTyped
信息。如果您想要keyCode
,请查看keyPressed
事件。如果您想要角色,请查看keyPressed
或keyTyped
个事件。