KeyEvent和KeyStroke的麻烦

时间:2014-07-24 11:08:17

标签: java swing keylistener keycode keystroke

我注意到我为同一keyCode获得了两个不同的Char。这是一个小实验:

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都认为我没有输入相同的字母。但我觉得这不正确。

1 个答案:

答案 0 :(得分:0)

您使用的是错误的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);

或:

final KeyStroke ks = KeyStroke.getKeyStroke('e');

请记住您自己的API:尝试在重载时检测此类冲突。 ; - )

此外,像MadProgrammer一样指出,不能解决你的问题。

您是否尝试过使用keyEvent.getKeyChar()?