为什么keyType将不同的KeyEvents返回给keyP的/keyRele的?
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结合起来(我们软件中暴露这一点的原始bug是处理Ctrl组合键)。
keyPressed: 17, , 17
keyPressed: 65, , 65
keyTyped: 0, , 0
keyReleased: 65, , 65
keyReleased: 17, , 17
只是要注意:17-控制,65-a。
在keyType
上,无法知道字符是什么。它似乎是一个null
字符。
由于字符没有在浏览器中呈现,因此根据编辑器和Eclipse,它在这里:
没有不同的键码。有和没有Ctrl
,“A”键生成的键码是65。按下Ctrl
时不同的是您从getKeyChar()
中获得的字符。应该的。
不,你得到的字符不是“anull
字符”,它是Ctrl A
字符,带有ascii代码1,它是不可打印的。但它就在那里。你只是看不到它,因为它是,嗯,嗯,不可打印的。
无论是否按下Ctrl
,键代码总是报告0。KeyEvent
类的keyCode
成员没有为KeyType
事件定义。它们只是重用相同的事件类,所以getter仍然在那里供您调用,但您不应该这样做,因为当事件是KeyType
时,您永远不会获得keyCode
信息。如果您想要一个keyCode
,请查看keyPed
事件。如果您想要一个字符,请查看keyP的
或keyType的
事件。