Как отобразить корневой элемент в JFace TreeViewer?

У меня есть JFace Treeviewer, однако он не отображает «корневой» элемент, который передается в качестве входных данных. Показаны только дети корня. Можно ли тоже вывести рут?


person pdeva    schedule 12.04.2011    source источник
comment
покажите свой код, относящийся к просмотрщику дерева.   -  person Harry Joy    schedule 12.04.2011
comment
не понимаю, зачем это нужно. в коде нет ничего особенного   -  person pdeva    schedule 12.04.2011


Ответы (3)


Вход не определяется как корень TreeViewer. На самом деле средство просмотра дерева не знает, какой из них является корневым, а какой нет. Решение принято contentprovider.getElements(). Скорее всего, я предполагаю, что вы вызываете getChildren() внутри этого метода. Это приводит к возврату дочерних элементов корневых элементов, а не самих корневых элементов.

person Prakash G. R.    schedule 14.04.2011
comment
getElements() возвращает массив объектов. Если я верну новый Object[]{element}, дерево покажет бесконечно расширяющиеся корневые элементы. каково правильное значение для возврата из getElements() в этом случае? - person pdeva; 15.04.2011
comment
В javadoc getElements() конкретно указано, что вы не должны возвращать inputElement. Вы устанавливаете корневой элемент в качестве ввода? Вы должны либо создать пустой/невидимый корень (если позволяет ваша модель), либо передать что-то, кроме корневого элемента, в качестве начального ввода. Во втором случае ContentProvider должен иметь возможность определить root из начального ввода. - person Prakash G. R.; 15.04.2011

Элемент ввода TreeViewer не должен отображаться. Задачу можно решить так:

treeViewer.setInput("root");

И в ContentProvider:

public Object[] getElements(Object arg0) {
    return new Object[] { rootItem }; // your root item you want to display
}
person Harry Siebert    schedule 29.07.2014

Я столкнулся с точно такой же проблемой и решил ее, используя логическое поле treeInputSet следующим образом, в котором Model — это класс домена, который вы хотите отобразить в дереве:

// Field to hold whether tree input was set
private boolean treeInputSet = false;    

// Other code...    

@Override 
public Object[] getElements(Object inputElement)
{
    if (inputElement instanceof Model)
    {
        if (treeInputSet)
        {
            Model model = (Model) inputElement;
            return model.getChildren().values().toArray();
        }
        else
        {
            treeInputSet = true;
            return new Object[] { inputElement };
        }
    }
    return null;
}
person Sytse Goedemoed    schedule 27.03.2013
comment
-1: Это неправильно. Вы не можете вернуть другой результат на основе предыдущих вызовов. Это абсолютно бессмысленно. - person Tom Seidel; 27.03.2013