如何为Netbeans中的特定编辑器添加一个钩子来关闭事件?

时间:2014-09-18 15:02:42

标签: java netbeans netbeans-platform netbeans-plugins

我需要在关闭特定文档的编辑器时执行某些操作。我有以下代码:

FileObject fobj = FileUtil.toFileObject(file);
final DataObject dobj = DataObject.find(fobj);
if (dobj != null) {
    EditorCookie ec = dobj.getLookup().lookup(EditorCookie.class);
    StyledDocument doc = ec.openDocument();
    // Here I would like to add a listener for close event, for the editor window that was opened
}

有没有办法做到这一点?或者我可以至少挂钩一个监听器来关闭全局编辑器,以便我收到关闭每个编辑器窗口的通知吗?我想在那种情况下我会以某种方式决定给定的编辑器窗口是否是我感兴趣的那个。

2 个答案:

答案 0 :(得分:4)

好的,我找到了一个有效的解决方案,然而,它仍然感觉像是一个丑陋的解决方法。我不明白为什么所有解决我的NetBeans IDE问题的方法看起来都很难看。我可以看到该平台旨在为创建新的编辑器和其他可插入组件准备一个很好的空间,但是,当人们只想听现有的组件(编辑器等)时,它就变成了一场噩梦。

在我目前的解决方案中,我将一个属性更改侦听器添加到TopComponent注册表并侦听" tcClosed"要更改的属性,然后我测试它是否有EditorCookie(所以它是否是编辑器)以及cookie是否与我想听的相同:

TopComponent.getRegistry().addPropertyChangeListener(new PropertyChangeListener() {
    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        if (evt.getPropertyName().equals("tcClosed") && evt.getOldValue() == null) {
            EditorCookie cookie = ((TopComponent) evt.getNewValue()).getLookup().lookup(EditorCookie.class);
            // I have to remember editor cookie to compare it to the one that is closed
            // so that I can find out whether it is the editor I want to listen to
            if (cookie != null && cookie.equals(ParentClass.this.getRememberedEditorCookie())) {
                // Do my stuff
            }
        }
    }
});

但是,如果有人知道更好的解决方案,我会很高兴听到它。

答案 1 :(得分:1)

偶然我偶然发现了一些可能对你有用的东西:

EditorCookie.Observable cookie = dataObject.getLookup().lookup(EditorCookie.Observable.class);
cookie.addPropertyChangeListener(new PropertyChangeListener() {
  @Override
  public void propertyChange(PropertyChangeEvent evt) {
    // Do your stuff
  }
});