3

我为我的孩子编写了一个程序来练习基本算术。JFrame 上有一个 JTextField,学生在其中键入给定数学问题的答案(例如 8+8,他们键入 16,回车)。此字段仅接受整数值作为 DocumentFilter 的条目。

那部分工作得很好。我想要做的是避免让用户不得不按下回车键。理想情况下,当用户键入第一个数字 (1) 时,会检查是否 1 == 16。如果不是,则不会发生任何事情。当他们随后键入 6 时,文本字段显示数字 16。我想运行检查以验证 16 == 16,然后处理输入,就好像用户也按下了 Enter 键一样。

txtAnswer.addKeyListener(new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent e) {               
            int key = e.getKeyCode();
            if (key == KeyEvent.VK_ENTER) {
                respondToAnswer(isTimed);
            } else {
                /* Check if the correct answer has been entered */
                System.out.println(txtAnswer.getText());
                //int userAnswer = Integer.parseInt(txtAnswer.getText());
                //if (userAnswer == correctAnswer {
                //   respondToAnswer(isTimed);
                //}
            }
        };
    });

这段代码不太好用。就好像它背后是一个角色。我的意思是当用户按下“1”键时(在我的 8+8=16 示例中),控制台输出是一个空字符串。当他们按下“6”键时,输出为“1”。如果他们随后按下另一个整数键,则输出为“16”。它总是落后一位数。因此,我无法捕获文本字段的全部内容以查看它是否与正确答案匹配。

有人看到我错过了什么吗?

谢谢!

4

2 回答 2

5

您应该DocumentListener用于此目的。 keyPressed可能在字段中的文本更新之前触发。

有关详细信息和示例,请参阅如何编写文档侦听器。

于 2013-02-06T23:47:27.563 回答
5

使用 aDocumentListener而不是 a KeyListener。在所有三个事件中,您都可以访问实际的文本内容。

Enter在 JTextField 上收听,我们使用ActionListener

旁注:您几乎不需要KeyListener. 对JTextComponent,永远靠一个DocumentListener。对于所有其他人,请使用适当的 Swing Key 绑定。KeyListener确实是一个低级 API。

于 2013-02-06T23:48:01.827 回答