我在我的swing应用程序中的KeyListener
上放了一个TextField
来尝试一些功能。目标是对TextField
中键入的每个键做出反应。用户只应键入数字,但如何输入,也可以输入字母字符。所以另外我必须在键入一个键之后每次检查,如果整个事情是一个数字,如果是这样,用这个数字做一些事情,如果没有,告诉用户没有退出程序就有错误。所以我想做这样的事情:
String enteredNumPlayers = "";
JTextField textfieldNumPlayers = new JTextField();
textfieldNumPlayers.setBounds(/*some values*/);
textfieldNumPlayers.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.DARK_GRAY));
textfieldNumPlayers.setHorizontalAlignment(JTextField.CENTER);
textfieldNumPlayers.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
if(e.getKeyChar()!=/*Code of the back key*/){
enteredNumPlayers += e.getKeyChar();
System.out.println(e);
}else{
enteredNumPlayers = enteredNumPlayers.substring(0, s1.length()-1);
}
try{
Integer.parseInt(enteredNumPlayers);
// do something with that number
}catch (NumberFormatException err){
new ErrorDialog("Not a number"); // my own method to allude user
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
}
});
现在我想通过System.out.println(e)
方法中的keyTyped(...)
来查看返回密钥的具体代码,但是后面会打印出来:
java.awt.event.KeyEvent[KEY_TYPED,keyCode=0,keyText=Unbekannt keyCode: 0x0,keyChar=Rücktaste,keyLocation=KEY_LOCATION_UNKNOWN,rawCode=0,primaryLevelUnicode=0,scancode=0,extendedKeyCode=0x0] on (...)
为什么每个键值或代码= 0或未知?不应该是ascii价值吗?使用“Rücktaste”也会很难看,因为在英语工作的计算机上,这个值会有所不同,不是吗?那么如何清楚地检查键入的键是否为后退键?
其他角色也会发生同样的事情,除了他们的keyChar是正确的。
答案 0 :(得分:2)
您要找的是DocumentFilter
,DocumentListener
或JFormattedTextField
。所有这三个都是一个更好的解决方案,然后使用一个关键的监听器,因为它还包括拖放,复制粘贴或任何其他机制,你可以想到将文本放入文本字段。
答案 1 :(得分:2)
我认为每次用户按下除整数之外的任何内容时都会显示一条错误消息,这有点令人讨厌。检查此示例code使用正则表达式匹配输入,并且具有仅接受数字的优点,其他任何内容都不会插入到文本字段中(通过覆盖insertString
PlainDocument
方法进行管理}})。