首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java KeyEvent混淆

Java KeyEvent混淆
EN

Stack Overflow用户
提问于 2014-04-10 18:46:16
回答 1查看 194关注 0票数 0

我有一个程序,它是一个模拟库存系统,有相当多的JTextField和一些这些字段必须遵守的正则表达式。另外,有些字段不能为空(显然)或空字符串。为了帮助用户输入数据,我添加了一些ImageIcon,以显示输入数据是否有效。(绿色检查或红色x)和i setVisibility()作为用户通过KeyEvents输入。

话虽如此,但这是一种困惑。我有一个街区,我很确定里面没有窃听器,但我发现有一些奇怪的事情发生了:

我只调用我的updateIcons()方法来响应keyTyped() -我对其他方法的重写是空的。现在,当键入一个键时,文本会在释放键之前打印在屏幕上,因此您可能会认为,一个输入字段只需要至少一个字符就不会通过有效性检查,因为如果keyTyped()是我的updateIcons()方法的唯一入口点,那么在释放该键并因此注册为“键类型”时,应该始终至少有一个字符。然而,它似乎是在密钥被注册到系统之前触发一个事件。更奇怪的是,如果我从重写的updateIcons()方法连续两次调用我的keyTyped()方法,程序仍然无法检查空字符串。但是,如果我将其称为keyPressed()keyReleased()keyTyped(),它们都用于同一事件,则为presto;有效数据。这可能是由于AWT的不稳定/错误造成的吗?

下面是updateIcons()方法,以防它是我忽略的,但是由于我得到了如此奇怪的结果,所以我不认为这是一个错误。

代码语言:javascript
复制
//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()工作得很好,或者请发布链接?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-10 19:00:33

您需要从keyReleased()调用update方法。我制作了一个简单的JTextField,它每次按下键时输出键及其getText(),并观察发生了什么:

代码语言:javascript
复制
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()事件更新。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22996470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档