【问题标题】:Saving TreeViewer state before setInput()在 setInput() 之前保存 TreeViewer 状态
【发布时间】:2016-04-01 15:29:22
【问题描述】:

我正在尝试保存 JFace TreeViewer 扩展状态以在调用 setInput() 方法后刷新它。我尝试了getExpandedElementssetExpandedElementsgetExpandedTreePathssetExpandedTreePathsTreeViewer 方法,但它不起作用。

Object[] expandedElements = viewer.getExpandedElements();
TreePath[] expandedTreePaths = viewer.getExpandedTreePaths();
viewer.setInput();
viewer.setExpandedElements(expandedElements);
viewer.setExpandedTreePaths(expandedTreePaths);

【问题讨论】:

    标签: java eclipse user-interface jface treeviewer


    【解决方案1】:

    您需要确保 TreeViewer 的内容提供程序提供的对象具有正确定义的 hashCodeequals 方法。 AbstractTreeViewer 需要能够比较新旧对象以确定它们的展开状态。如果未提供 hashCodeequals,这是一个简单的参考检查,如果您重新创建了内容,它将无法工作。

    【讨论】:

    • 这可行,但对我来说并不明显:问题的代码仍然需要,以及良好的 hashCode/equals 实现。
    【解决方案2】:

    this thread中提到的,看看已故的ResourceNavigator,来自 org.eclipse.ui.views.navigator 包裹。
    (“延迟”是因为不再直接使用该类,请参阅Eclipse Wiki)。

    (见eclipse Java Model

    它使用TreeViewer,并保存展开的元素和选定的元素等状态。
    模型元素是IResource 对象,使用IPersistableElement/IElementFactory 机制进行持久化。
    IPersistableElement 适配器在 WorkbenchAdapter 类中针对 IResource 注册,但这可以通过直接实现 IPersistableElement 的模型元素获得。
    对应的IElementFactoryorg.eclipse.ui.ideplugin.xmlelementFactory 扩展中声明。

    恢复的资源知道如何通过树的内容提供程序获取自己的子(和父),因此并非树的所有元素都需要持久化。

    可以使用类似的方法来保存查看者的输入资源。
    对于ResourceNavigator,这里通过其FrameList 的当前帧存在一定程度的间接性,但如果您在调试器中单步执行它,您会发现它本质上是在做同样的事情。


    小摘录(但其余代码还保存了许多其他内容,包括选择)

    if (frameList.getCurrentIndex() > 0) {
        //save frame, it's not the "home"/workspace frame
        TreeFrame currentFrame = (TreeFrame) frameList.getCurrentFrame();
        IMemento frameMemento = memento.createChild(TAG_CURRENT_FRAME);
        currentFrame.saveState(frameMemento);
    } else {
        //save visible expanded elements
        Object JavaDoc expandedElements[] = viewer.getVisibleExpandedElements();
        if (expandedElements.length > 0) {
            IMemento expandedMem = memento.createChild(TAG_EXPANDED);
            for (int i = 0; i < expandedElements.length; i++) {
                if (expandedElements[i] instanceof IResource) {
                    IMemento elementMem = expandedMem
                            .createChild(TAG_ELEMENT);
                    elementMem.putString(TAG_PATH,
                            ((IResource) expandedElements[i]).getFullPath()
                                    .toString());
                }
            }
        }
        [...]
     }
    

    【讨论】:

      猜你喜欢
      • 2010-12-27
      • 2019-06-25
      • 1970-01-01
      • 2011-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-14
      • 2015-10-24
      相关资源
      最近更新 更多