java jtextfield监听_java – JTextField的Action侦听器,用于更改另...

我假设您不明白只有当用户按下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.

您可能想要玩“超时”值;)

然后你可以使用像……

pxsEa.gif

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);

这显然不提供任何验证,因此如果文本不是数字,它可能会抛出异常,但我会留下来让你弄明白

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值