首页 > 解决方案 > JText 字段,仅当用户更改某些内容时才通知更新

问题描述

我想知道是否有办法注意到侦听器是否正在更改 JTextField 的文本,或者是否由 .setText(); 我需要区分这两种情况,因为当用户或程序访问它时,它需要做不同的事情。

标签: javaswingjtextfield

解决方案


我假设您使用 aDocumentListener来挂钩用户的输入。setText您可以在从程序中调用 时删除此文档侦听器。

看看下面的例子。按下按钮时,文本会更改,但不会显示打印消息。

public class DocumentListenerExample extends JFrame {
    private JTextField textField;
    private DocumentListener textFieldDocumentListener;

    public DocumentListenerExample() {
        super("");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        setLayout(new FlowLayout());

        textField = new JTextField(20);
        textFieldDocumentListener = new DocumentListener() {

            @Override
            public void removeUpdate(DocumentEvent e) {
                System.out.println("Text changed by user");
            }

            @Override
            public void insertUpdate(DocumentEvent e) {
                System.out.println("Text changed by user");
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                System.out.println("Text changed by user");
            }
        };
        textField.getDocument().addDocumentListener(textFieldDocumentListener);

        add(textField);

        JButton button = new JButton("Change text");
        button.addActionListener(e -> {
            textField.getDocument().removeDocumentListener(textFieldDocumentListener);
            textField.setText(String.valueOf(Math.random()));
            textField.getDocument().addDocumentListener(textFieldDocumentListener);
        });

        add(button);

        pack();
        setLocationByPlatform(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            new DocumentListenerExample().setVisible(true);
        });
    }
}

推荐阅读