JTextField的动作侦听器,用于更改另一个文本字段中的值

Dan*_*Ali 1 java swing actionlistener jtextfield

我有两个JTextfields,我希望第二个Textfield的值/文本根据第一个TextField中的值/文本的任何变化而改变

这就是我在做的事情

    textField_15 = new JTextField("100");
    textField_15.setEditable(false);
    textField_15.setColumns(10);
    textField_15.setBounds(161, 253, 86, 20);
    panel_3.add(textField_15);

    textField_14 = new JTextField();
    textField_14.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            int az = Integer.parseInt(textField_14.getText());
            int aw = Integer.parseInt(textField_15.getText());
            int aq = aw - az;
            String ar = String.valueOf((aq));
            JOptionPane.showMessageDialog(null, az + " " +aw + " " + aq + " " + ar);
            textField_15.setText(ar);
        }
    });
    textField_14.setColumns(10);
    textField_14.setBounds(426, 186, 86, 20);
    panel_3.add(textField_14);
Run Code Online (Sandbox Code Playgroud)

Mad*_*mer 7

我假设您不明白ActionListener只有在用户按下Enter键时才会收到通知...

这将是最简单的解决方案,但是,如果要监视文本组件的更改,则应使用a DocumentListener

有关更多详细信息,请参见如何使用文本字段,如何编写动作侦听器以及侦听文档的更改

然而,这引发了一些问题.您何时假设用户已停止输入?

之间有显著差异100100,所以我们需要的是好歹推迟事件通知到一些在未来的时间,在这里我们可以"假设"用户已经停止输入(或至少足够长时间,我们抢合理的价值)

public class DeferredDocumentChangedListener implements DocumentListener {

    private Timer timer;
    private List<ChangeListener> 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();
    }

}
Run Code Online (Sandbox Code Playgroud)

好的,这是一个小技巧.这是一个简单的observable DocumentListener,它在将来的某个时刻提供文档已更改的事件通知.在你的情况下,你并不真正关心变化,只是它有.

这设置了一个Timer具有短延迟的非重复Swing (在该示例中为250毫秒),如果在该段时间内未重置,则将通知任何已注册的ChangeListeners.但是,如果Document在该时间段内修改,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);
Run Code Online (Sandbox Code Playgroud)

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

您可能还想了解如何使用旋转器以及如何使用格式化文本字段,这些字段提供了有助于验证用户输入的后验证过程.

您还可以使用a DocumentFilter来进一步限制用户可以输入的内容,有关详细信息,请参阅实现文档过滤器DocumentFilter示例