我遇到以下问题,我试图限制用户只输入字母值。任何其他不按字母顺序排列的值(按下键)都会引发错误。但是有3个例外,其中两个工作正常。
例外1:Del Key
例外2:返回键
例外3: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(" ");
}
}
});
提示赞赏:)
@MadProgrammer
示例是,要求用户输入他的姓氏,名字,中间名和移动电话号码&&amp ;;家庭电话号码。显然我们不想要字母字段中的数值,反之亦然:)
答案 0 :(得分:4)
不要将密钥字符与密钥代码进行比较。它们通常是不同的东西。
密钥代码是一个虚拟概念,用于允许不同的键盘类型和输入方法。
相反,请使用e.getKeyCode() == KeyEvent.VK_SHIFT
。
如果您尝试将输入限制为任何类型的文本组件,KeyListener
不是您想要的界面。您需要使用DocumentFilter代替。这将允许y在输入到字段文档时过滤文本。
出于多种原因,这是一种更好的方法。首先,您无法控制通知的顺序KeyListeners
,这意味着键击可能已经在文本组件到达您的监听器之前已经提交给它。其次,如果用户将文字粘贴到您的字段中,它将完全绕过KeyListener
。
答案 1 :(得分:2)
那是因为 Shift 键没有Unicode键字符。它可能正在返回KeyEvent.VK_UNDEFINED
。而是, Shift 键修改其他按键(即,通常将它们大写)。
来自the Javadoc,getKeyChar
:
返回与此事件中的键关联的字符。例如,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);
}