10

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

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

2 回答 2

9

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

于 2009-10-16T20:09:07.137 回答
3

正如这个线程中提到的,看看后期ResourceNavigator,从 org.eclipse.ui.views.navigator包。
(“迟到”是因为不再直接使用该类,请参阅Eclipse Wiki)。

替代文字(如eclipse Java Model中所见)

它使用TreeViewer, 并保存展开的元素和选定的元素等状态。
模型元素是使用/机制IResource持久化的对象。适配器在 class 中注册,但这可以通过模型元素直接实现来获得。 对应的声明在's的扩展中。IPersistableElementIElementFactory
IPersistableElementIResourceWorkbenchAdapterIPersistableElement
IElementFactoryelementFactoryorg.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());
            }
        }
    }
    [...]
 }
于 2009-10-16T12:19:01.867 回答