4

我正在尝试做一些看起来应该很常见的事情,所以我很惊讶我很难找到解决方案。

我有一个简单的 Eclipse RCP 应用程序。它由一个视图组成,其中包含一个分层显示 xml 文件元素的 treeViewer。另一面是一个编辑器,它包含各种字段,例如文本框等,用于显示和修改 xml 值。treeviewer 在元素名称旁边显示图标,我要做的是在编辑器中进行更改时将图标更改为图标的“修改”版本 - 表示该元素的值已更改。这与 Eclipse 在与 subversion 集成时显示文件已从 Package Explorer 中的基本修订版修改后的方式非常相似。

我将尝试仅显示与此特定问题相关的代码部分,并希望我不会遗漏任何内容。这是编辑器类:

public class XmlEditor extends EditorPart
{
    protected boolean dirty = false;

    public void setDirty(boolean value)
    {
        dirty = value;
        firePropertyChange(PROP_DIRTY);
    }
}

这是树的视图:

public class TreeView extends ViewPart implements IPropertyChangeListener {
    public void createPartControl(Composite parent) {
        treeViewer = new TreeViewer(parent, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL);
        getSite().setSelectionProvider(treeViewer);

        treeViewer.setLabelProvider(new TreeObjLabelProvider());
        treeViewer.setContentProvider(new TreeObjContentProvider());

        PlatformUI.getWorkbench().getWorkingSetManager().addPropertyChangeListener(this);
    }

    public void propertyChange(PropertyChangeEvent event) {
        if (event.getProperty().equals(IWorkbenchPartConstants.PROP_DIRTY)) {
            treeViewer.refresh();
        }
    }
}

在这种情况下,TreeView::propertyChange()即使firePropertyChange()被解雇,也不会被调用。任何想法为什么?我也对不涉及 PropertyChangeListener 的任何其他想法持开放态度,这似乎是当时最简单的方法。谢谢你。

4

3 回答 3

4

这是我最终解决问题的方法:

  1. 更改 TreeView 以实现IPropertyListener而不是IPropertyChangeListener
  2. 实现了propertyChanged()方法来执行treeViewer.refresh()
  3. 在该XmlEditor::createPartControl()方法中,我获得了对该Treeview部分的引用,然后将其添加到属性侦听器中,如下所示:
    • TreeView treeView = (TreeView) getSite().getPage().findView(TreeView.ID);
    • addPropertyListener(treeView);

现在,就像我需要的那样,TreeView::propertyChanged()在之后被调用。firePropertyChanged()需要大量的实验来了解IPropertyListener和和IPropertyChangeListener之间的区别。addPropertyListener()addPartPropertyListener()

感谢 nitind 给了我一个新的视角,并向我展示了装饰器,这绝对是正确的方法,而不是将树形图标更改为修改后的版本。

于 2013-04-19T21:03:32.853 回答
0

您在编辑器部分触发了与工作集管理器无关的属性更改。您所做的任何事情都没有将视图连接到编辑器。如果您希望两者相互交谈,请编写它们以相互交谈,或者至少通过进行您描述的修改来创建事件并对事件做出反应。

我也很确定这不是 SVN 显示文件已被修改的方式。SVN 可能提供了一个装饰器:http ://eclipse.org/articles/Article-Decorators/decorators.html

于 2013-04-19T04:23:58.110 回答
0

在您的创建部件控件中添加这串代码,这可能会对您有所帮助

ResourcesPlugin.getWorkspace().addResourceChangeListener(new IResourceChangeListener() {

        @Override
        public void resourceChanged(IResourceChangeEvent event) {
            treeViewer.refresh();
        }
    });
于 2017-05-26T06:34:09.183 回答