Проблема обновления Java Custom Tree Model

Вот структура дерева:

корневые ветви --leafs

Я использую для TreeModel DefaultTreeModel и мои объекты реализуют интерфейс TreeNode

Лист это какой-то объект:

public class Leaf implements TreeNode
{
   // implementation

В филиале есть список листьев:

public class Branch implements TreeNode
{
 private List<Leaf> leafs;

 // implementation

И корень является контейнером веток:

public class Root implements TreeNode
{
  private List<Branch> branches;

  // implementation

Когда я добавляю новый лист, мое дерево не обновляется, когда я добавляю лист и создаю новую DefaultTreeModel с моим корневым объектом, оно обновляется. Я наблюдаю за реализацией DefaultMutableTreeNode, при вставке дочерних элементов не происходит никакого события... Что я делаю не так? Ранее я пытался реализовать интерфейс TreeModel, который выглядит намного лучше, чем реализация интерфейса TreeNode для трех классов, но результат был схожим. Я также читал о GlazedLists, но мне не нравится их концепция дерева. Для меня лучшим является реализация концепции интерфейса TreeModel, но как обновить модель, когда какой-то внутренний список в модели добавляет новый элемент?...

2 ответа

Решение

Не видя код, трудно быть уверенным - тем не менее, я сделаю ставку на свое предположение: вы не уведомляете TreeModel о ваших вставках;-)

Фрагмент кода того, что вам нужно сделать, если ваша реализация узла не имеет тип MutableTreeNode:

 // do the parent wiring in your custom TreeNode
 int position = myBranch.addChild(node);
 // notify the model 
 model.nodesWhereInserted(myBranch, new int[] {pos}); 

Если он имеет тип MutableTreeNode, то более простой способ заключается в использовании вспомогательных методов в DefaultTreeModel.

 model.insertNodeInto(node, myBranch, position)

Это похоже на проблему с параллелизмом в Swing, возможно, обновления выходят из EDT,

Вы должны добавить новый объект, а затем проверить DefaultTreeModel если содержит новый объект, если объекты существуют, то вы должны обернуть (все обновления) в invokeLater, за Serializable или же Observate было бы лучше искать invokeAndWait

Другие вопросы по тегам