我假设您不明白只有当用户按下Enter键时才会通知ActionListener …
这将是最简单的解决方案,但是,如果要监视文本组件的更改,则应使用DocumentListener
然而,这引发了一些问题.您何时假设用户已停止输入?
100和1以及0和0之间存在显着差异,因此我们需要将事件通知推迟到将来某个时间,我们可以“假设”用户已停止输入(或至少足够长的时间)让我们抓住合理的价值)
public class DeferredDocumentChangedListener implements DocumentListener {
private Timer timer;
private List listeners;
public DeferredDocumentChangedListener() {
listeners = new ArrayList<>(25);
timer = new Timer(250, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
fireStateChanged();
}
});
timer.setRepeats(false);
}
public void addChangeListener(ChangeListener listener) {
listeners.add(listener);
}
public void removeChangeListener(ChangeListener listener) {
listeners.add(listener);
}
protected void fireStateChanged() {
if (!listeners.isEmpty()) {
ChangeEvent evt = new ChangeEvent(this);
for (ChangeListener listener : listeners) {
listener.stateChanged(evt);
}
}
}
@Override
public void insertUpdate(DocumentEvent e) {
timer.restart();
}
@Override
public void removeUpdate(DocumentEvent e) {
timer.restart();
}
@Override
public void changedUpdate(DocumentEvent e) {
timer.restart();
}
}
好的,这是一个小技巧.这是一个简单的可观察DocumentListener,它在将来的某个时刻提供文档已更改的事件通知.在你的情况下,你并不真正关心变化,只是它有.
这将设置一个具有短延迟(本例中为250毫秒)的非重复Swing Timer,如果在该段时间内未重置,则会通知任何已注册的ChangeListeners.但是,如果在该时间段内修改了文档,则重置Timer.
您可能想要玩“超时”值;)
然后你可以使用像……
JTextField number = new JTextField(5);
JTextField sum = new JTextField("0", 5);
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
add(number, gbc);
add(sum, gbc);
DeferredDocumentChangedListener listener = new DeferredDocumentChangedListener();
listener.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
int num1 = Integer.parseInt(number.getText());
int num2 = Integer.parseInt(sum.getText());
int result = num1 + num2;
sum.setText(Integer.toString(result));
number.selectAll();
}
});
number.getDocument().addDocumentListener(listener);
这显然不提供任何验证,因此如果文本不是数字,它可能会抛出异常,但我会留下来让你弄明白