我正在尝试为我的NetBeans模块实现NavigatorPanel。 现在,我希望每当修改关联的DataObject时都会收到通知,以便我可以调用解析器并更新导航器。
我尝试将DataChangeListener添加到DataObject,但这只是通知我有关对文档进行的第一次更改,就是这样。但是,我注意到第一次调用PropertyChangeListener.propertyChange()方法时,propertyName设置为“COOKIE”,第二次设置为“MODIFIED”。
当编辑器中的文档内容(而不是基础FileObject!)发生变化时,有关如何始终的任何想法都会收到通知吗?
修改 我已经看过http://wiki.netbeans.org/DevFaqListenForSaveEvents了。他们声明PropertyChangeListener用于获取有关正在保存的文档的通知(例如,通过Ctrl + S),如果想要通知有关内容的修改,则应使用FileChangeListener。但这对我不起作用。在任何一种情况下,当我在编辑器中修改文档时,我都没有得到通知,除了使用PropertyChangeListener时,我得到通知,但只是第一次编辑内容(与他们在编辑时完全相反) FAQ)。
EDIT2: 我还没弄清楚如何正确通知。但在我的情况下,我应该从不同的角度实际接近我的目标,即因为我想根据解析结果更新NavigatorPanel,我应该注册ParserResultTask。通过这个我可以定义什么时候我应该得到通知,当我收到通知时,我也得到我已经解析的结果,我需要更新面板。
嗯,这不是对实际问题的直接回答,而是针对这一特定问题的更合适的解决方案。
答案 0 :(得分: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论坛帖子。