Java键事件混淆

Java键事件混淆,java,regex,awt,jtextfield,keyevent,Java,Regex,Awt,Jtextfield,Keyevent,我有一个程序,它是一个模拟库存系统,有很多JTextField,还有一些正则表达式,其中一些字段必须遵守。此外,某些字段不能为null(显然)或空字符串。为了帮助用户输入数据,我添加了一些ImageIcon,以显示输入数据是否有效。(绿色复选框或红色x)和IsetVisibility(),用户通过KeyEvents键入 话虽如此,这就是困惑。我有一个区块,我很确定它没有bug,但我发现有一些奇怪的事情发生: 我只是调用我的updateIcons()方法来响应keyTyped()——我对其他方法的

我有一个程序,它是一个模拟库存系统,有很多
JTextField
,还有一些正则表达式,其中一些字段必须遵守。此外,某些字段不能为null(显然)或空字符串。为了帮助用户输入数据,我添加了一些
ImageIcon
,以显示输入数据是否有效。(绿色复选框或红色x)和I
setVisibility()
,用户通过KeyEvents键入

话虽如此,这就是困惑。我有一个区块,我很确定它没有bug,但我发现有一些奇怪的事情发生:

我只是调用我的
updateIcons()
方法来响应
keyTyped()
——我对其他方法的覆盖是空的。现在,当键入一个键时,文本会在释放键之前打印在屏幕上,因此您可能会认为输入字段至少需要一个字符才能通过有效性检查,因为if
keyTyped()
是我的
updateIcons()
方法的唯一入口点,在释放密钥并注册为“键入的密钥”时,应始终至少有一个字符。然而,它似乎在密钥注册到系统之前触发了一个事件。更奇怪的是,如果我从重写的
keyTyped()
方法中连续两次调用我的
updatecons()
方法,程序仍然无法检查空字符串。但是如果我为同一事件调用
keyPressed()
keyreased()
,和
keyTyped()
,那么presto;有效数据。这可能是由AWT的不稳定/故障引起的吗

这里是updatecons()方法,以防我忽略了它,但由于我得到了如此奇怪的结果,我认为这不是我这边的一个bug

//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());
     }
}

更新:我是个白痴-如果我只从
keyreased()
调用
updatecons()
一次,并将
keyPressed()
keyTyped()
保留为空,那么它就可以正常工作。虽然我喜欢学习东西;有人能解释一下为什么
keyTyped()
在这种用法中有缺陷,但是
keyreased()
工作正常,或者请发布一个链接吗

您需要从
keyreased()
调用更新方法。我制作了一个简单的
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()
事件更新。

您必须使用DocumentFilter