سؤال

أحاول حفظ 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 صفقة.
("متأخر" لأن هذا الفصل لم يعد يستخدم مباشرة ، انظر الكسوف ويكي).

alt text (كما رأينا في نموذج Eclipse Java)

يستخدم TreeViewer, ، ويحفظ العناصر الموسعة والعناصر المختارة ، من بين ولاية أخرى.
عناصر النموذج IResource الكائنات ، التي استمرت باستخدام IPersistableElement/IElementFactory آلية.
ال IPersistableElement المحول مسجل ضد IResource في الفصل WorkbenchAdapter, ، ولكن يمكن الحصول على هذا بدلاً من ذلك من خلال تنفيذ عنصر النموذج IPersistableElement مباشرة.
المناظرة IElementFactory تم إعلانه في elementFactory التمديد في org.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());
            }
        }
    }
    [...]
 }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top