我正在尝试拯救 JFace TreeViewer 调用后刷新扩展状态 setInput() 方法。我试过 getExpandedElements, setExpandedElements, getExpandedTreePaths, setExpandedTreePaths 的方法 TreeViewer 但它不起作用。

Object[] expandedElements = viewer.getExpandedElements();
TreePath[] expandedTreePaths = viewer.getExpandedTreePaths();
viewer.setInput();
viewer.setExpandedElements(expandedElements);
viewer.setExpandedTreePaths(expandedTreePaths);
有帮助吗?

解决方案

您需要确保您的TreeViewer的内容提供商提供有其hashCodeequals方法正确定义的对象。 AbstractTreeViewer需要能够比较新旧对象,以确定其扩张状态。如果不提供hashCodeequals,这是一个简单的参考检查,这将不工作,如果你重新创建你的内容。

其他提示

正如中提到的 这个线程, ,看看迟到的 ResourceNavigator, , 来自org.eclipse.ui.views.navigator 包裹。
(“迟到”是因为该类不再直接使用,请参阅 日食维基).

alt text (如在 Eclipse Java 模型)

它使用一个 TreeViewer, ,并保存展开的元素和选定的元素等状态。
模型元素是 IResource 对象,这些对象使用持久化 IPersistableElement/IElementFactory 机制。
IPersistableElement 适配器已注册 IResource 在班上 WorkbenchAdapter, ,但这可以通过模型元素实现来获得 IPersistableElement 直接地。
相应的 IElementFactory 被声明在 elementFactory 延伸于 org.eclipse.ui.ideplugin.xml.

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

类似的方法可用于保存观看者的输入资源。
为了 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());
            }
        }
    }
    [...]
 }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top