حفظ حالة TreeViewer قبل setInput ()
-
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());
}
}
}
[...]
}