Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java KeyEvent未识别按下shift键_Java_Keylistener_Keyevent - Fatal编程技术网

Java KeyEvent未识别按下shift键

Java KeyEvent未识别按下shift键,java,keylistener,keyevent,Java,Keylistener,Keyevent,我有以下问题,我试图限制用户只输入字母值。任何其他非字母顺序的值(按下键)都将抛出错误。但是有3个例外,其中两个正常工作。例外1:Del键例外2:Back键例外3:Shift这是因为Shift键没有Unicode键字符。它可能返回KeyEvent.VK\u UNDEFINED。相反,Shift键修改其他按键(即,通常将其大写) 从,getKeyChar: 返回与此事件中的键关联的字符。例如,shift+“a”的键类型事件返回“a”的值 不要使用getKeyChar,而是尝试使用getKeyCod

我有以下问题,我试图限制用户只输入字母值。任何其他非字母顺序的值(按下键)都将抛出错误。但是有3个例外,其中两个正常工作。
例外1:Del键
例外2:Back键
例外3:Shift这是因为Shift键没有Unicode键字符。它可能返回
KeyEvent.VK\u UNDEFINED
。相反,Shift键修改其他按键(即,通常将其大写)

从,
getKeyChar

返回与此事件中的键关联的字符。例如,shift+“a”的键类型事件返回“a”的值

不要使用
getKeyChar
,而是尝试使用
getKeyCode
,这将

返回与此事件中的键关联的整数键代码

您可能还必须使用
getKeyChar
来按下
isAlphabetic
按钮(如果这些对您很重要的话)


编辑:以下是一个工作示例:

public static void main(String[] args) {
    JFrame f = new JFrame();
    JButton button = new JButton("Press keys");
    button.addKeyListener(new KeyAdapter() {

        @Override
        public void keyPressed(KeyEvent ke) {
            if (ke.getKeyCode() == KeyEvent.VK_SHIFT) {
                System.out.println("You pressed Shift");
            } else {
                System.out.println("You pressed a non-Shift key");
                // [ more logic ]
            }
        }

    });
    f.add(button, BorderLayout.CENTER);
    f.pack();
    f.setVisible(true);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

不要将密钥字符与密钥代码进行比较。它们通常是不同的东西

按键代码是一个虚拟概念,用于支持不同的键盘类型和输入方法

相反,使用类似于
e.getKeyCode()==KeyEvent.VK_SHIFT
的方法

如果您试图将输入限制为任何类型的文本组件,
KeyListener
不是您想要的接口。您将希望使用一个。这将允许y在输入到fields文档时过滤文本


这是一个更好的方法,原因有很多。第一种情况是,您无法控制通知
keysisters
的顺序,这意味着在到达侦听器之前,按键可能已经提交到文本组件。其次,如果用户将文本粘贴到您的字段中,它将完全绕过
KeyListener

是的,这是有效的。谢谢,我不知道Shift实际上没有unicode密钥字符。@MaciejCygan给出了一个例子,这样我就可以告诉你如何破解it@MadProgrammer我已经用exmpnice catch更新了我的原始问题,最好使用自动完成或JSpinnerCopy的JFormatted字段复制一些文本(最好是违反规则的文本,如“Mad1”)从某个地方粘贴到你的一个字段,让我知道你的情况。
public static void main(String[] args) {
    JFrame f = new JFrame();
    JButton button = new JButton("Press keys");
    button.addKeyListener(new KeyAdapter() {

        @Override
        public void keyPressed(KeyEvent ke) {
            if (ke.getKeyCode() == KeyEvent.VK_SHIFT) {
                System.out.println("You pressed Shift");
            } else {
                System.out.println("You pressed a non-Shift key");
                // [ more logic ]
            }
        }

    });
    f.add(button, BorderLayout.CENTER);
    f.pack();
    f.setVisible(true);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}