class KeyDemoFrame extends JFrame implements KeyListener
{
String line1;
KeyDemoFrame()
{
setTitle("hello");
setSize(200,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
addKeyListener(this);
}
public void keyTyped(KeyEvent e) {
line1 = e.getKeyText(e.getKeyCode());
JOptionPane.showMessageDialog(null, e.getKeyCode());
JOptionPane.showMessageDialog(null, e.getKeyText(e.getKeyCode()));
}
public void keyPressed(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
}
}
当我按任意键时,第一个消息对话框的“0”和第二个消息对话框的“Unknown keyCode:0x0”。
我做错了什么?
答案 0 :(得分:2)
您似乎将非美国版面作为默认布局。 Java不喜欢它并生成带有无效密钥代码的事件。作为对策,您可以为美国分配主要布局。
答案 1 :(得分:1)
使用e.getKeyChar()
答案 2 :(得分:1)
您需要在KeyCode
事件中获取KeyPressed
然后您可以在KeyTyped
中使用它,当然您将使用的变量必须在这两个事件之外声明。
答案 3 :(得分:0)
我认为你还需要这个来捕捉这个事件:
/**
* Notification that an event has occured in the AWT event
* system
*
* @param e Details of the Event
*/
public void eventDispatched(AWTEvent e) {
if (e.getID() == KeyEvent.KEY_PRESSED) {
keyPressed((KeyEvent) e);
}
if (e.getID() == KeyEvent.KEY_RELEASED) {
keyReleased((KeyEvent) e);
}
if (e.getID() == KeyEvent.KEY_TYPED) {
keyTyped((KeyEvent) e);
}
}
答案 4 :(得分:0)
来自KeyEvent的
}的的Java文档getKeyCode
返回:键盘上实际键的整数代码。 (对于KEY_TYPED事件,keyCode为VK_UNDEFINED。)
您正在使用keyTyped事件,因此返回的值为VK_UNDEFIED。
但是,您可以使用以下内容来获取键入的字符:
JOptionPane.showMessageDialog(null, e.getKeyChar());
答案 5 :(得分:0)
您可能会收到三种类型的事件:KEY_PRESSED
,KEY_RELEASED
和KEY_TYPED
事件。前两个与键盘上按下和释放键的操作相关联(可能会或可能不会导致输入字符),而第三个与字符输入相关联:
KEY_PRESSED
和KEY_RELEASED
事件:
e.getKeyCode()
会返回有效的密钥代码e.getKeyChar()
返回CHAR_UNDEFINED
KEY_TYPED
个事件:
e.getKeyChar()
返回有效的Unicode字符e.getKeyCode()
返回VK_UNDEFINED
您的代码正在监听KEY_TYPED
个事件,但之后使用的e.getKeyCode()
仅对KEY_PRESSED
和KEY_RELEASED
个事件有效。