2

我正在尝试为我的 NetBeans 模块实现 NavigatorPanel。现在,我希望在修改关联的 DataObject 时始终收到通知,以便我可以调用解析器并更新导航器。

我尝试将 PropertyChangeListener 添加到 DataObject 中,但这只会通知我对文档所做的第一次更改,仅此而已。但是,我注意到第一次调用 PropertyChangeListener.propertyChange() 方法时,propertyName 设置为“COOKIE”,第二次设置为“MODIFIED”。

当编辑器中的文档内容(而不是底层 FileObject!)发生变化时如何始终得到通知的任何想法?

编辑: 我已经看过http://wiki.netbeans.org/DevFaqListenForSaveEvents。他们指出,PropertyChangeListener 用于获取有关正在保存的文档的通知(例如,通过 Ctrl+S),如果希望收到有关内容修改的通知,则应使用 FileChangeListener。但这对我不起作用。在任何一种情况下,当我在编辑器中修改文档时,我都不会收到通知,除了使用 PropertyChangeListener 时,我确实会收到通知,但只是在我第一次编辑某些内容时(与他们在常问问题)。

EDIT2: 我还没有弄清楚如何得到正确的通知。但在我的情况下,我实际上应该从不同的角度接近我的目标,即因为我想根据解析结果更新 NavigatorPanel,我可能应该注册一个 ParserResultTask。这样我就可以定义什么时候应该收到通知,当我收到通知时,我还可以获得更新面板所需的已经解析的结果。

好吧,这不是对实际问题的直接答案,而是针对这个特定问题的更合适的解决方案。

4

1 回答 1

1

这是对我有用的东西。请注意,仅当您保存更改时才会触发事件。请注意,下面的代码可能无法很好地编译,因为我已删除我的代码以使其简洁。但这就像在 DataObject 上实现 FileChangeListener 一样简单。Geertjan 不久前对此做了一篇博文。让我知道事情的后续。

https://blogs.oracle.com/geertjan/entry/org_openide_filesystems_filechangelistener

public class YourDataObject extends MultiDataObject implements FileChangeListener {


    public YourDataObject(FileObject pf, MultiFileLoader loader) throws DataObjectExistsException, IOException {
        super(pf, loader);
        pf.addFileChangeListener(this);
        registerEditor("text/x-puml", true);
    }

    @Override
    protected int associateLookup() {
        return 1;
    }


    @Override
    public void fileFolderCreated(FileEvent fe) {}

    @Override
    public void fileDataCreated(FileEvent fe) {}

    @Override
    public void fileChanged(FileEvent fe) {
        System.out.println("Here =========== :" + fe);
    }

    @Override
    public void fileDeleted(FileEvent fe) {}

    @Override
    public void fileRenamed(FileRenameEvent fre) {}

    @Override
    public void fileAttributeChanged(FileAttributeEvent fae) {}
}

编辑

没关系,我忘了你不想处理 FileObject。这是一个netbeans论坛帖子。

http://forums.netbeans.org/ptopic7909.html

于 2013-05-23T04:27:15.173 回答