【发布时间】:2019-02-07 04:22:42
【问题描述】:
我想做一个可编程计算器,我有基本的 GUI,现在我正在尝试设置按钮和显示。我的显示文本基本上是“0”,如果用户输入一个数字,则应该显示该数字。我试图用 KeyListener 来做,但如果我按下一个键,它会显示该键两次。为什么?
textField.addKeyListener(new KeyListener(){
boolean newNumber = true;
public void keyTyped(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if(keyCode == e.VK_BACK_SPACE && textField.getText().length() == 1){
textField.setText("0");
newNumber = true;
}
if(textField.getText().equals("0") && newNumber){
textField.setText(KeyEvent.getKeyText(keyCode));
newNumber = false;
}
}
public void keyReleased(KeyEvent e) {
}
});
输入前:
“1”后输入:
【问题讨论】:
-
不要为此使用
KeyListener,而是使用DocumentFilter,这是它的设计目的 -
为了理解“为什么”会发生这种情况,您需要了解文本编辑的“如何”工作。基本上正在发生的事情是,
keyPressed事件已传递给您的侦听器,您正在将文本设置为您想要的值。然后将关键事件传递给JTextField的侦听器,该侦听器正在使用来自关键事件的信息更新底层Document(已包含1),因此它出现两次 - 这是众多事件之一您不想使用KeyListener的原因以及任何建议您继续使用“变通”的方法都是一种黑客攻击 -
@MadProgrammer 我猜类似的东西,只是我不知道如何解决它。我已经在这个程序中使用了 DocumentFilter,但老实说,我真的不明白它是如何工作的,所以我无法自己弄清楚。我想我会容易得多,也许不是那么好,但现在已经足够了。
-
另见calculator example。它使用
ScriptEngine来评估文本字段中的表达式。
标签: java swing jtextfield keylistener