我有一个程序,它是一个模拟库存系统,有相当多的JTextField和一些这些字段必须遵守的正则表达式。另外,有些字段不能为空(显然)或空字符串。为了帮助用户输入数据,我添加了一些ImageIcon,以显示输入数据是否有效。(绿色检查或红色x)和i setVisibility()作为用户通过KeyEvents输入。
话虽如此,但这是一种困惑。我有一个街区,我很确定里面没有窃听器,但我发现有一些奇怪的事情发生了:
我只调用我的updateIcons()方法来响应keyTyped() -我对其他方法的重写是空的。现在,当键入一个键时,文本会在释放键之前打印在屏幕上,因此您可能会认为,一个输入字段只需要至少一个字符就不会通过有效性检查,因为如果keyTyped()是我的updateIcons()方法的唯一入口点,那么在释放该键并因此注册为“键类型”时,应该始终至少有一个字符。然而,它似乎是在密钥被注册到系统之前触发一个事件。更奇怪的是,如果我从重写的updateIcons()方法连续两次调用我的keyTyped()方法,程序仍然无法检查空字符串。但是,如果我将其称为keyPressed()、keyReleased()和keyTyped(),它们都用于同一事件,则为presto;有效数据。这可能是由于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()打一次电话给keyPressed()和keyTyped(),让keyPressed()和keyTyped()空的话,效果会很好。不过,我喜欢学习一些东西;有人能解释一下为什么keyTyped()在这种用法中是错误的,但是keyReleased()工作得很好,或者请发布链接?
发布于 2014-04-10 19:00:33
您需要从keyReleased()调用update方法。我制作了一个简单的JTextField,它每次按下键时输出键及其getText(),并观察发生了什么:
keyPressed:c
text:
keyTyped:c
text:
keyReleased:c
text:c
keyPressed:a
text:c
keyTyped:a
text:c
keyReleased:a
text:ca
keyPressed:t
text:ca
keyTyped:t
text:ca
keyReleased:t
text:cat您可以看到,JTextField的实际文本没有被keyTyped()或keyPressed()事件更新。
https://stackoverflow.com/questions/22996470
复制相似问题