2009-10-16 5 views
10

मैं setInput() विधि को कॉल करने के बाद इसे रीफ्रेश करने के लिए जेएफएएस TreeViewer विस्तार स्थिति को सहेजने की कोशिश कर रहा हूं। मैंने getExpandedElements, setExpandedElements, getExpandedTreePaths, setExpandedTreePathsTreeViewer के तरीकों की कोशिश की लेकिन यह काम नहीं करता है।सेट इनपुट से पहले TreeViewer स्थिति सहेजना()

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

उत्तर

10

आप सुनिश्चित करें कि आपके TreeViewer की सामग्री प्रदाता वस्तुओं है कि उनके hashCode है प्रदान करता है बनाने की जरूरत है और equals विधियों को सही तरीके से परिभाषित किया गया है। AbstractTreeViewer को अपनी विस्तार स्थिति निर्धारित करने के लिए पुरानी और नई वस्तुओं की तुलना करने में सक्षम होना चाहिए। यदि hashCode और equals प्रदान नहीं किए जाते हैं, तो यह एक साधारण संदर्भ जांच है, जो आपकी सामग्री को फिर से बनाते समय काम नहीं करेगा।

+0

धन्यवाद, यह बराबर और हैशसेट विधियों को लागू करने के बाद काम करता है .. – penguru

3

this thread में उल्लेख किया है, org.eclipse.ui.views.navigator पैकेज से, देर से ResourceNavigator पर एक नज़र डालें।
("देर से" क्योंकि उस वर्ग का अब उपयोग नहीं किया गया है, Eclipse Wiki देखें)।

alt text (eclipse Java Model के रूप में देखा)

यह एक TreeViewer का उपयोग करता है, और विस्तारित तत्वों और चयनित तत्वों, अन्य राज्य के बीच बचत होती है।
मॉडल तत्व IResource ऑब्जेक्ट्स हैं, जो IPersistableElement/IElementFactory तंत्र का उपयोग कर बने रहे हैं।
IPersistableElement एडाप्टर IResource के खिलाफ WorkbenchAdapter में पंजीकृत है, लेकिन इसके बजाय इसे IPersistableElement लागू करने वाले मॉडल तत्व द्वारा प्राप्त किया जा सकता है।
संबंधित IElementFactory में 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()); 
      } 
     } 
    } 
    [...] 
}