为什么 keyTyped 会向 keyPressed/keyReleased 返回不同的 KeyEvent?
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
字符”,它是 Ctrl+A
字符,ascii 代码为 1,并且它是无法打印的。但它就在那里。你只是看不到它,因为它,呃,嗯,无法打印。
Ctrl
,KeyTyped
始终报告按键代码 0。 KeyEvent
类的 keyCode
成员未针对 KeyTyped
事件定义。它们只是重用相同的事件类,因此 getter 仍然可供您调用,但您不应该这样做,因为当事件为 时,您永远不会获得
。如果您需要 keyCode
信息键输入keyCode
,请查看 keyPressed
事件。如果您想要一个字符,请查看 keyPressed
或 keyTyped
事件。
关于Java Swing keyEvent 与 keyPressed/keyReleased - 不同的键代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45462556/