2009-10-16 105 views
10

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

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

回答

10

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

+0

谢谢,它实现了equals和hashset方法后工作.. – penguru 2009-10-19 07:42:17

3

正如this thread提到,看看在ResourceNavigator后期,从 org.eclipse.ui.views.navigator包。
(“晚”,因为该类不再直接使用,请参阅Eclipse Wiki)。

alt text(如见于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()); 
      } 
     } 
    } 
    [...] 
}