【发布时间】:2014-07-24 11:08:16
【问题描述】:
我注意到对于同一个 Char,我得到了两个不同的 keyCode。这是一个小实验:
package main;
import com.sun.javafx.scene.control.Keystroke;
import javax.swing.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class Keystroketest {
public static void main(String[] args) {
final KeyStroke ks = KeyStroke.getKeyStroke('e', 0);
System.out.println(ks.getKeyCode());
JFrame f = new JFrame();
JTextField jtf = new JTextField("");
f.setBounds(300, 300, 100, 60);
f.add(jtf);
f.setVisible(true);
jtf.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent keyEvent) {
}
@Override
public void keyPressed(KeyEvent keyEvent) {
}
@Override
public void keyReleased(KeyEvent keyEvent) {
System.out.println(keyEvent.getKeyCode());
if (keyEvent.getKeyCode() == ks.getKeyCode()) {
System.out.println("letters are similar");
} else {
System.out.println("letters aren't similar");
}
}
});
}
}
如果我在textField 中输入字母“e”,那么当我解析它时,它会为同一个字母返回不同的KeyCode。
这是什么原因?以及如何检查我输入的字母/字符是否与上述代码中定义的特定字符相同...?
所以每当我检查我输入的KeyCode 时,java 都会认为我没有输入相同的字母。但我认为这是不正确的。
【问题讨论】:
-
你真的不应该在文本字段上使用
KeyListener,如果你有兴趣过滤内容,你应该使用DocumentFilter -
无状态是什么意思?
-
表示虚拟键没有任何信息可以与
E或e区分开来 -
但实际问题在于您如何使用
getKeyStroke。您使用的方法实际上调用了int而不是char,它代表了虚拟键码。尝试使用KeyStroke.getKeyStroke(char)将产生0的虚拟键代码。一般来说,这种反向查找是非常困难的 -
是的,我已经注意到了,现在我改变了结构,检查的不是 KeyCode,而是带 Char 的 KeyChar,我没有遇到任何问题。
标签: java swing keylistener keycode keystroke