Вопрос

Я пытаюсь сохранить 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 (как видно из затмение Java-модель)

Он использует TreeViewer, и сохраняет развернутые элементы и выбранные элементы среди прочего состояния.
Элементами модели являются IResource объекты, которые сохраняются с помощью IPersistableElement/IElementFactory механизм.
В IPersistableElement адаптер зарегистрирован на IResource в классе WorkbenchAdapter, но вместо этого это можно было бы получить, реализуя элемент модели IPersistableElement напрямую.
Соответствующий IElementFactory объявлено в elementFactory расширение в org.eclipse.ui.ide's 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());
            }
        }
    }
    [...]
 }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top