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');