Синхронизация TreeView с несколькими вложенными списками ObservableList

У меня есть ObservableList из ObservableLists из ObservableLists...

Это в основном опускается на 4 уровня.

У цели есть список

Цель имеет список

В стратегии есть список

Tactic имеет список

Задача

Очевидно, это идеальный сценарий для настройки TreeView для отображения этих данных. Как сделать так, чтобы любые изменения, внесенные в структуру, отображались и в TreeView?

Я думаю, что Goal будет корневым узлом. Всякий раз, когда цель добавляется в ее список, мы можем прослушивать ее и предупреждать цель о том, что цель только что была создана. Как и где мне настроить этот слушатель? Я предупреждаю цель? Или я должен предупредить какой-нибудь статический служебный класс об обновлении его TreeView?


person Toni_Entranced    schedule 12.07.2014    source источник


Ответы (1)


Используя ObservableList и добавляя слушателей, вы можете легко делать свое дело.

Предположим, вы поместили Слушателя на свою цель. Затем вы увидите некоторые изменения цели. Если произойдет изменение (например, добавлена ​​​​цель), вы нацелите TreeItem на использование конкретной цели (например, с картой), а затем добавите к нему дочерний элемент.

Конечно, вы можете упростить свою работу, используя такие методы:

private void addObjective(TreeItem<Object> specificGoal, List<Strategy > objective){
    TreeItem<Object> objectiveTreeItem = new TreeItem<>(objective);

    for(List<Tactic> strategy: objective){
        addStrategy(objectiveTreeItem, strategy);
    }
    specificGoal.getChildren().add(objectiveTreeItem);
}

Наличие метода для каждого из ваших слоев.

Конечно, если объем данных невелик, вы можете просто стереть элементы TreeView и повторно запустить метод, который вы использовали для его создания, с обновленным списком. Проще, но не оптимизировано.

person Maxoudela    schedule 18.07.2014
comment
Мне удалось заставить работать добавление и удаление TreeItems, добавив слушателей в каждый из ObservableList. Однако прослушиватель изменений не улавливает обновление элементов. Если я изменю имя цели, я ожидаю, что TreeView также отразит это изменение. Но как? - person Toni_Entranced; 19.07.2014
comment
Ваши Слушатели будут записывать изменения только в Списке. Добавление или удаление элемента. Если вы хотите реагировать, когда что-то внутри вашего объекта меняется, я предлагаю вам взглянуть на событие ( docs.oracle.com/javafx/2/events/jfxpub-events.htm ). Например, когда вы меняете имя цели, вы можете запускать событие (собственное событие, расширяющее класс), куда вы помещаете то, что было изменено и т. д., и т. д. Или вы можете прослушивать некоторые свойства (если ваш класс цели использует свойства Javafx) внутри вашего пользовательского TreeCell. - person Maxoudela; 19.07.2014
comment
Большое спасибо! Я рассмотрю возможность использования этого. - person Toni_Entranced; 19.07.2014