我在NetBeans IDE中有一个Java Swing应用程序。
我制作了一个表单并将KeyListener附加到我的各种控件中:
jButton1.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyTyped(java.awt.event.KeyEvent evt) {
keyTypedEvent(evt);
}
});
和keyTypedEvent
定义如下:
private void keyTypedEvent(java.awt.event.KeyEvent evt)
{
System.out.println(evt);
appendDisplay(String.valueOf(evt.getKeyChar()));
}
我在println
添加了evt
,看看会发生什么,并验证我的keylistener是否有效。
当我构建并运行我的应用程序时,我意识到输出似乎总是有keycode = 0
为了验证这一点,我将println更改为evt.getKeyCode()
,并且始终返回0.
我可能完全误解了KeyCode的功能,但我认为它可以与Oracle文档中的值进行协调:
http://docs.oracle.com/javase/7/docs/api/constant-values.html#java.awt.event.KeyEvent.VK_ESCAPE
例如,VK_ESCAPE的值为27.
答案 0 :(得分:26)
keyTyped()
事件仅用于生成字符输入的键。如果您想知道何时按下或释放任何键,您需要实施keyPressed()
或keyReleased()
。
来自KeyEvent API:
"键入键入"事件是更高级别的,通常不依赖于 平台或键盘布局。它们是在Unicode时生成的 输入字符,是了解的首选方式 字符输入....
对于按下键和释放键的事件,getKeyCode方法返回 事件的keyCode。对于键入的事件,getKeyCode方法 总是返回VK_UNDEFINED。
答案 1 :(得分:3)
关于KeyListener
的{{1}}的所有建议都是错误的,这意味着JButton
these events are implemented and correctly in JButtons API
,使用SwingAction
或添加ActionListener
从Button1.addKeyListener(new java.awt.event.KeyAdapter() {
Mouse and Key Event
基本上所有内容都在Oracle教程中描述How to Use Buttons, Check Boxes, and Radio Buttons
答案 2 :(得分:0)
这很大程度上取决于按下的按键。您可能需要使用KeyListener
方法覆盖keyPressed
,因为keyTyped
未在不可打印的字符上触发。
在此处查看keyTyped
和keyPressed
之间的区别:
KeyListener, keyPressed versus keyTyped