Java KeyEvent和击键故障
我注意到,对于相同的Java KeyEvent和击键故障,java,swing,keylistener,keycode,keystroke,Java,Swing,Keylistener,Keycode,Keystroke,我注意到,对于相同的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 mai
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都认为我键入的字母不同。但我认为这是不对的。您使用了错误的getKeyStroke方法:
final KeyStroke ks = KeyStroke.getKeyStroke('e', 0);
调用getKeyStroke(int-keyCode,int-modifiers),因为“char”被解释为16位值,可以自动转换为32位int值。只有在没有拟合方法的情况下才会发生自动装箱
使用其中一个
final KeyStroke ks = KeyStroke.getKeyStroke(Character.valueOf('e'), 0);
或:
对于您自己的API,请记住:在重载时尝试检测此类冲突。;-)
而且,正如程序员所指出的那样,这并不能解决您的问题
您尝试过使用keyEvent.getKeyChar()吗?您确实不应该在文本字段上使用
KeyListener
,如果您对过滤内容感兴趣,您应该使用DocumentFilter
是无状态的这意味着什么?这意味着虚拟键并没有任何信息可以将其与E
或E
区分开来,但实际问题在于如何使用getKeyStroke
。您使用的方法实际上调用的是int
而不是char
,它表示虚拟键代码。尝试使用击键。getKeyStroke(char)
将导致虚拟键代码0
。一般来说,执行这种反向查找是非常困难的。是的,我注意到,现在我已经改变了我的结构,并没有检查KeyCode,而是检查带有Char的KeyChar,我没有任何问题。虽然您的观察结果是正确的KeyStroke.getKeyStroke('e')
或KeyStroke.getKeyStroke(Character.valueOf('e'),0)
导致keycode
为0
,而不是VK\u E
或69
。。。
final KeyStroke ks = KeyStroke.getKeyStroke('e');