在 setInput() 之前保存 TreeViewer 状态
-
21-09-2019 - |
题
我正在尝试拯救 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的内容提供商提供有其hashCode
和equals
方法正确定义的对象。 AbstractTreeViewer
需要能够比较新旧对象,以确定其扩张状态。如果不提供hashCode
和equals
,这是一个简单的参考检查,这将不工作,如果你重新创建你的内容。
其他提示
正如中提到的 这个线程, ,看看迟到的 ResourceNavigator
, , 来自org.eclipse.ui.views.navigator
包裹。
(“迟到”是因为该类不再直接使用,请参阅 日食维基).
(如在 Eclipse Java 模型)
它使用一个
TreeViewer
, ,并保存展开的元素和选定的元素等状态。
模型元素是IResource
对象,这些对象使用持久化IPersistableElement
/IElementFactory
机制。
这IPersistableElement
适配器已注册IResource
在班上WorkbenchAdapter
, ,但这可以通过模型元素实现来获得IPersistableElement
直接地。
相应的IElementFactory
被声明在elementFactory
延伸于org.eclipse.ui.ide
的plugin.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());
}
}
}
[...]
}