Проблема обновления Java Custom Tree Model - PullRequest
3 голосов
/ 23 сентября 2011

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

корень -ветви --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 ]

4 голосов
/ 23 сентября 2011

Не видя код, трудно быть уверенным - тем не менее, я сделаю ставку на свое предположение: вы не уведомляете 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)
2 голосов
/ 23 сентября 2011

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

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

...