2009-10-16 64 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()); 
      } 
     } 
    } 
    [...] 
}