Java Swing - 检测文档变化

3
为了学校,我正在尝试使用Java的Swing重新创建Microsoft的记事本程序。 我正在处理保存和打开.txt文件,并且正在寻找一种方法使程序能够检测到文档是否发生更改。 如果检测到更改并且用户选择打开或创建新文件,则希望程序在继续之前提示用户是否要保存更改。
我的想法是创建一个标志,称为documentChanged,其最初为false,并且每当对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来实现记事本菜单栏的项目。我的问题是,有没有办法在同一类中同时使用TextListener和ActionListener(或任何其他监听器)?如果不行,那么检测文档更改的最佳方法是什么?

那段代码是如何编译的??TextListeners不能与JTextAreas一起使用。 - Hovercraft Full Of Eels
1
请使用DocumentListener代替。https://docs.oracle.com/javase/tutorial/uiswing/events/documentlistener.html - Vighanesh Gursale
1
你为什么认为Java类不能实现多个接口?可以查看java.lang.String API文档作为一个例子。 - William Price
2个回答

3

你的链接,看起来非常熟悉! :) - Hovercraft Full Of Eels

2

你这个怎么能编译通过呢?

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

由于TextListeners并非专门用于JTextArea而是针对TextArea的完全不同类型的组件。

因此,您应该向JTextArea的文档添加DocumentListener。

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与程序中其他地方使用的ActionListeners无关,因为它们的领域是正交的,即一个与另一个完全没有关系。


啊,那是我的错误。我正在研究文本区域,没有想到它完全是一个不同的概念。谢谢你提供关于DocumentListener的信息 - 我会尝试一下看看效果如何! - user4307840
@GordythePirate:我也强烈建议您不要让GUI类实现任何监听器接口,因为这会给它们太多的责任,并导致可怕的“交换机”监听器的创建。根据监听器的大小和复杂程度,使用匿名内部类、私有内部类或独立类作为监听器。 - Hovercraft Full Of Eels
好知道!我不知道这是不好的做法——这只是我们学习实现监听器的第一种方法,所以我想它一直跟着我。我的代码已经相应地进行了更改,再次感谢您的帮助! - user4307840

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接