Java Swing - 检测文档中的更改

时间:2014-11-30 03:53:24

标签: java swing listeners

对于学校,我尝试使用Java的Swing重新创建Microsoft的记事本程序。我正在处理保存和打开.txt文件的问题,我试图找出一种方法,让程序检测何时对文档进行了更改。如果检测到更改并且用户选择打开或创建新文件,我希望程序在继续之前提示用户是否要保存更改。

我的想法是创建一个名为documentChanged的标志,该标志最初为假,并且只要对JTextArea进行了更改,就会设置为true。为了检测这种变化,我考虑使用TextListener如下:

public class JNotepad implements ActionListener
{
    boolean documentChanged;
    JTextArea notepad;

    JNotepad()
    {
        documentChanged = false;

        notepad = new JTextArea();
        notepad.addTextListener(new TextListener() {
            public void textValueChanged(TextEvent te) {
                documentChanged = true;
            }
        });
    }
}

但是,我了解到Java类无法同时实现多个接口,而且我已经使用ActionListener来实现记事本菜单栏中的项目。

我的问题是,有没有办法在同一个班级同时使用TextListenerActionListener(或任何其他听众)?如果没有,那么检测文件变更的最佳行动计划是什么?

2 个答案:

答案 0 :(得分:3)

这是另一篇文章的回答。见Text Changed event in JTextArea? How to?

另请参阅Oracle中的How to Write a Document ListenerDocumentListener),您将看到一个applet示例。

答案 1 :(得分:2)

你如何编译

notepad = new JTextArea();
notepad.addTextListener(new TextListener() {
   // ....
}

因为TextListeners没有定义为使用JTextAreas而是使用TextAreas,这是一个完全不同的野兽。

您应该将DocumentListener添加到JTextArea的文档中。

notepad.getDocument().addDocumentListener(new DocumentListener() {
    void insertUpdate(DocumentEvent e) {
        documentChanged = true;
    }

    void removeUpdate(DocumentEvent e) {
        documentChanged = true;
    }

    void changedUpdate(DocumentEvent e) {
        documentChanged = true;
    }

});

关于

  

我的问题是,有没有办法在同一个类中同时使用TextListeners和ActionListeners(或任何其他侦听器)?

使用DocumentListener与程序中其他地方使用的ActionListener无关,因为它们的域彼此正交,即一个与另一个完全无关。