Иерархическое дерево Ваадинов из XML (MSDL) - PullRequest
1 голос
/ 01 декабря 2011

Я пытаюсь построить дерево Vaadin из файла XML (MSDL), я застрял при добавлении дочерних элементов в мое дерево. Пока что я могу читать из своего XML-файла и отображать нужные мне теги / информацию, но не могу сделать из них иерархическую структуру, например:

У меня есть файл XML с некоторой информацией о планетах и ​​их лунах и галактике, в которой они находятся:

Milky Way
 -Sunsystem
  -Earth
   -"Moon"
  -Mars
    -Phobos
    -Deimos
  -Saturn
    -Titan
    -Tethys
Pinwheel Galaxy
 -somesystem
   -weirdPlanet1
     -moon1
     -moon2
   -weirdPlanet2
     -moon1
     -moon2

теперь я хочу иметь такую ​​же структуру в моем ваадиновом дереве. я пробовал много вещей, но результат всегда был одинаковым: некоторые нулевые значения, добавленные к дереву, я мог видеть только галактики, но я не мог их развернуть, или я мог видеть дерево со всей информацией, но там нет структуры все планеты / луны, где только что перечислены: /

1 Ответ

1 голос
/ 02 декабря 2011

Я почти уверен, что это не имеет никакого отношения к самому Дереву. Вместо того, чтобы добавлять данные непосредственно в дерево, вы можете попробовать это:

  1. Разобрать данные XML в HierarchicalContainer
  2. Выполните итерацию по HierarchicalContainer с примером кода ниже и убедитесь, что он идентичен структуре вашего XML-файла
  3. Свяжите контейнер данных с деревом, вызвав Tree.setContainerDataSource (Container)

Пример кода для итерации через HierarchicalContainer:

void iterateContainer() {
    for(Object rootItemId : myContainer.rootItemIds()) {
        Item rootItem = myContainer.getItem(rootItemId);
        System.out.println(rootItem.getItemProperty(myLabelProperty).getValue());

        iterateChildren(rootItemId, 1);
    }
}

void iterateChildren(Object parentItemId, int indent) {

    for(Object childItemId : myContainer.getChildren(parentItemId)) {
        Item childItem = myContainer.getItem(childItemId);

        for(int i = 0; i < indent; i++) {
            System.out.print(" ");
        }
        System.out.println(childItem.getItemProperty(myLabelProperty).getValue());

        if(myContainer.hasChildren(childItemId)) {
            iterateChildren(childItemId, indent+1);
        }
    }

}

Это всего лишь некоторый непроверенный код QnD, но это должно помочь вам перебрать контейнер.

edit: только что заметил, что мой ответ мог быть (частично) глупым решением, так как Tree уже использует HierarchicalContainer. Вы можете инициализировать myContainer HierarchicalContainer myContainer = (HierarchicalContainer) myTree.getContainerDataSource(); и использовать приведенный выше код.

edit2: И если структура не идентична, посмотрите, где она идет не так, и пусть отладчик сделает все остальное ..:)

...