3

我有以下问题,我试图限制用户只输入字母值。任何其他非字母的值(按下的键)都会引发错误。但是有 3 个例外,其中两个工作正常。
exception1:Del Key
exception2:Back Key
exception3:Shift <- 这个无法识别,我不知道为什么

SurnameSearch.addKeyListener(new KeyAdapter(){
        public void keyPressed(KeyEvent e){
            char ch = e.getKeyChar();
                if(Character.isAlphabetic(ch)|| (ch == KeyEvent.VK_BACK_SPACE) || (ch == KeyEvent.VK_DELETE) || (ch == KeyEvent.VK_SHIFT)){/*null*/}
                  else{
                    JOptionPane.showMessageDialog(null, "Only letters are allowed!");
                    SurnameSearch.setText(" ");
            }
        }
    });

提示赞赏:)


@疯狂程序员

例如,要求用户输入他的姓氏、名字、中间名和移动电话号码 && 家庭电话号码。所以显然我们不想要字母字段中的数值,反之亦然:)

4

2 回答 2

4

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

键码是一个虚拟概念,用于允许不同的键盘类型和输入法。

相反,使用类似e.getKeyCode() == KeyEvent.VK_SHIFT.

如果您试图将输入限制为任何类型的文本组件,KeyListener则不是您想要的界面。您将希望改用DocumentFilter。这将允许 y 在输入到字段文档时过滤文本。

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

于 2013-03-10T20:30:14.757 回答
2

那是因为Shift密钥没有 Unicode 密钥字符。它可能正在返回KeyEvent.VK_UNDEFINED。相反,该Shift键修改了其他按键(即,通常将它们大写)。

JavadocgetKeyChar

返回与此事件中的键关联的字符。例如,shift + "a" 的 KEY_TYPED 事件返回 "A" 的值。

而不是使用getKeyChar,尝试getKeyCode

返回与此事件中的键关联的整数 keyCode。

您可能还必须使用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);
}
于 2013-03-10T20:18:10.983 回答