Java JText字段,注意仅当用户更改某些内容时才更新

Java JText字段,注意仅当用户更改某些内容时才更新,java,swing,jtextfield,Java,Swing,Jtextfield,我想知道是否有一种方法可以注意到侦听器是否正在更改JTextField的文本,或者是否是由.setText()完成的;我需要区分这两种情况,因为当用户或程序访问时,它需要做不同的事情。我假设您使用文档监听器连接到用户的输入。在从程序中调用setText时,可以删除此文档侦听器 看看下面的例子。按下按钮时,文本将更改,而不显示打印消息 public class DocumentListenerExample extends JFrame { private JTextField textF

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

我假设您使用
文档监听器
连接到用户的输入。在从程序中调用
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);
        });
    }
}

可能的重复(超出重复关闭投票数)使用DocumentListener,如重复所述,但在程序更改文本字段值时将其关闭,在程序完成更改后再次打开。一个简单的布尔标志就足以允许您这样做。