Диалоговое окно TreeViewer java eclipse не дает дочерних элементов дерева

Я создал пользовательский поставщик контента, который реализует ITreeContentProvider, и мою пользовательскую модель, похожую на эту: Vogella Tutorial JFace, где у него есть категории, а задачи и задачи хранятся как дочерние элементы категорий в виде списка в классе Category. Я использую диалог eclipse CheckedTreeSelectionDialog, и он должен быть таким же, как любой диалог дерева, и я расширил его, чтобы иметь возможность получать проверенные элементы на карте, но по какой-то причине я могу получить элемент дерева уровня 1, но не их дочерние элементы, и я не могу понять Зачем.

    public void createMapOfCheckedItems() {
    mapOfCheckedElements = new HashMap<Object, List<Object>>();
    for (TreeItem level1 : getTreeViewer().getTree().getItems()) {
     if (level1.getChecked()) {
      List<Object> checkedChildren = new ArrayList<Object>();
      for (TreeItem level2 : level1.getItems()) {
                if (level2.getChecked()) {
                    checkedChildren.add(level2.getData());
                }
            }
            mapOfCheckedElements.put(level1.getData(), checkedChildren);
        }
    }
}

Код приведен выше, но level1.getItems() возвращает пустой элемент дерева, но в диалоговом окне выбора правильно отображаются родители и дети.


person user847988    schedule 28.11.2012    source источник
comment
Как вы получаете доступ к детям определенного ключа? Вы делаете mapOfCheckedElements.get(level1)? Возможно, вам следует поместить элемент дерева непосредственно в HashMap, а не в его данные.   -  person GGrec    schedule 11.12.2012
comment
Как вы создаете зрителя?   -  person Behnil    schedule 14.12.2012
comment
Пожалуйста, опубликуйте содержимое метода getTreeViewer().   -  person tkotisis    schedule 15.12.2012


Ответы (1)


Чтение TreeItem#getItems() API Javadoc Я нашел это:

Возвращает (возможно, пустой) массив TreeItems, которые являются прямыми дочерними элементами получателя. Примечание. Это не фактическая структура, используемая приемником для ведения своего списка элементов, поэтому изменение массива не повлияет на приемник.

Мои познания в SWT API не слишком обширны, но я предполагаю, что использование TreeViewer#getItems(org.eclipse.swt.widgets.Item) метод может решить проблему, так как предполагается, что средство просмотра поддерживает состояние всех узлов.

Итак, ваш код должен выглядеть примерно так:

if (level1.getChecked()) {
      List<Object> checkedChildren = new ArrayList<Object>();
      for (Item level2 : getTreeViewer().getItems(level1)) {
            if (((TreeItem)level2).getChecked()) {
                 checkedChildren.add(level2.getData());
            }
      }
      mapOfCheckedElements.put(level1.getData(), checkedChildren);
 }
person Tomas Narros    schedule 17.12.2012