我有一个我为孩子们编写的程序来练习基本算术。 JFrame上有一个JTextField,其中学生键入给定数学问题的答案(如8 + 8,他们键入16,回车)。此字段仅通过DocumentFilter接受整数值作为条目。
那部分工作正常。我想要做的是避免用户必须按Enter键。理想情况下,当用户键入第一个数字(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”。它总是落后一位数。因此,我无法捕获文本字段的全部内容以查看它是否与正确答案匹配。
任何人都能看到我错过的东西吗?
谢谢!
答案 0 :(得分:5)
您应该使用DocumentListener
来实现此目的。在更新字段中的文本之前,可能会触发keyPressed
。
有关详细信息和示例,请参阅How to Write a Document Listener。
答案 1 :(得分:5)
使用DocumentListener
代替KeyListener
。在所有三个活动中,您都可以访问实际的文本内容。
要在JTextField上收听 Enter ,我们ActionListener
旁注:你几乎不需要KeyListener
。在JTextComponent
,始终依赖DocumentListener
。对于所有其他人,请使用适当的Swing Key绑定。 KeyListener
实际上是一个低级API。