【发布时间】:2014-04-10 18:46:16
【问题描述】:
我有一个程序,它是一个模拟库存系统,有很多 JTextField 和一些其中一些字段必须遵守的正则表达式。此外,某些字段不能为空(显然)或空字符串。为了帮助用户输入数据,我添加了一些ImageIcon 来显示输入数据是有效还是无效。 (绿色检查或红色 x)和我 setVisibility() 作为用户通过 KeyEvents 键入。
话虽如此,这就是混乱。我有一个块,我很确定其中没有错误,但我发现发生了一些奇怪的事情:
我只是调用我的updateIcons() 方法来响应keyTyped() - 我对其他人的覆盖是空的。现在,当键入一个键时,文本会在键释放之前打印在屏幕上,因此您会认为只需要至少一个字符的输入字段永远不会通过有效性检查,因为如果 keyTyped() 是唯一的我的updateIcons() 方法的入口点,在释放键时应该总是至少有一个字符,因此注册为“键入的键”。但是,它似乎在密钥注册到系统之前触发了一个事件。更奇怪的是,如果我从被覆盖的keyTyped() 方法中连续两次调用我的updateIcons() 方法,程序仍然无法检查空字符串。但是,如果我将其称为 keyPressed()、keyReleased() 和 keyTyped() 全部用于同一个事件,那么快;有效数据。这可能是由 AWT 的不稳定性/错误引起的吗?
这里是 updateIcons() 方法,以防我忽略了它,但由于我得到了如此奇怪的结果,我不认为这是我的错误。
//called from keyTyped
//formInputIcons is a 2D array[8][2] where the first dimension represents
//the form input field, and the second dimension is the ImageIcons for that field
//public final Pattern upcRegex = Pattern.compile("^\\d{12}$");
//public final Pattern anyNumRegex = Pattern.compile("^\\d+$");
public void updateIcons(KeyEvent e){
if(e.getSource() == formAddInputs[0]){
formInputIcons[0][0].setVisible( ! (upcRegex.matcher(
((JTextField)e.getSource()).getText()).matches()));
formInputIcons[0][1].setVisible(upcRegex.matcher(
((JTextField)e.getSource()).getText()).matches());
}else if(e.getSource() == formAddInputs[1]){
formInputIcons[1][0].setVisible(((JTextField)e.getSource()).getText().equals(""));
formInputIcons[1][1].setVisible( ! ((JTextField)e.getSource()).getText().equals(""));
}else if(e.getSource() == formAddInputs[3]){
formInputIcons[3][0].setVisible(((JTextField)e.getSource()).getText().equals(""));
formInputIcons[3][1].setVisible( ! ((JTextField)e.getSource()).getText().equals(""));
}else if(e.getSource() == formAddInputs[4]){
formInputIcons[4][0].setVisible(((JTextField)e.getSource()).getText().equals(""));
formInputIcons[4][1].setVisible( ! ((JTextField)e.getSource()).getText().equals(""));
}else if(e.getSource() == formAddInputs[6]){
formInputIcons[6][0].setVisible( ! (anyNumRegex.matcher(
((JTextField)e.getSource()).getText()).matches()));
formInputIcons[6][1].setVisible(anyNumRegex.matcher(
((JTextField)e.getSource()).getText()).matches());
}else if(e.getSource() == formAddInputs[7]){
formInputIcons[7][0].setVisible( ! (anyNumRegex.matcher(
((JTextField)e.getSource()).getText()).matches()));
formInputIcons[7][1].setVisible(anyNumRegex.matcher(
((JTextField)e.getSource()).getText()).matches());
}
}
更新:我是个白痴——如果我只从keyReleased() 调用一次updateIcons() 并将keyPressed() 和keyTyped() 留空,它就可以正常工作。我喜欢学习东西;有人可以解释为什么keyTyped() 在这种用法中有问题,但keyReleased() 工作正常或请发布链接?
【问题讨论】:
-
你必须使用 DocumentFilter
标签: java regex awt jtextfield keyevent