【问题标题】:Trouble with KeyEvent and KeyStrokeKeyEvent 和 KeyStroke 的问题
【发布时间】: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
  • 无状态是什么意思?
  • 表示虚拟键没有任何信息可以与Ee区分开来
  • 但实际问题在于您如何使用getKeyStroke。您使用的方法实际上调用了int 而不是char,它代表了虚拟键码。尝试使用KeyStroke.getKeyStroke(char) 将产生0 的虚拟键代码。一般来说,这种反向查找是非常困难的
  • 是的,我已经注意到了,现在我改变了结构,检查的不是 KeyCode,而是带 Char 的 KeyChar,我没有遇到任何问题。

标签: java swing keylistener keycode keystroke


【解决方案1】:

您使用了错误的 getKeyStroke 方法:

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

调用 getKeyStroke(int keyCode, int modifiers),因为“char”被解释为可以自动转换为 32 位 int 值的 16 位值。自动装箱只有在没有合适的方法时才会发生。

使用任一

final KeyStroke ks = KeyStroke.getKeyStroke(Character.valueOf('e'), 0);

或:

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

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

另外,就像 MadProgrammer 指出的那样,这不会解决您的问题。

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

【讨论】:

  • 虽然您的观察结果是正确的KeyStroke.getKeyStroke('e')KeyStroke.getKeyStroke(Character.valueOf('e'), 0) 导致keycode0,而不是VK_E69...
猜你喜欢
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多