Проблема обновления 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