Почему мой JTree не обновляется, когда TreeModel добавляет новые узлы?
Вопрос
Я использую DefaultTreeModel
Заполнен переопределением DefaultMutableTreeNode
который поддерживает необязательно изменение строки отображения узла в дереве. Как показано в коде ниже, в своей форме я заполняю дерево новыми узлами, создавая их в отдельном классе, а затем передавая их через класс обертки для моего основного типа данных. Процедура должна создать новый переопределенный DefaultMutableTreeNode
, добавить детей (каждый AccessPoint
представлен узлом с несколькими дочерними узлами), затем храните его для последующего использования в пользовательском интерфейсе.
В первый раз, когда я добавляю узел таким образом, он прекрасно работает. Любой последующий узел, добавленный со следующим кодом, фактически хранится в DefaultTreeModel
, но JTree
не обновляется новыми узлами.
Почему это то, что JTree
Разве не заполняется после добавления первого ребенка?
private void populateAccessPointTreeModel(AccessPointDataWrapper wrapper) {
//the pre-created DefaultMutableTreeNode subclass instance is
// stored in the wrapper
DefaultMutableTreeNode accessPointNode =
wrapper.getAccessPointTreeNode();
//this line updates the accessPointTree with the new node (I've looked at the
// value in debug mode, and it does in fact add the node
((DefaultMutableTreeNode) accessPointTree.getRoot()).add(accessPointNode);
//unrelated logic happens down here...
}
Я могу включить код, где я создаю узел, если это необходимо, но я не думаю, что это проблема.
Решение
Проблема в том, что DefaultMutableTreeNode
не сообщает DefaultTreeModel
что его дети были обновлены. Для этого вы либо захотите вызвать соответствующий метод в модели таблицы (nodesChanged
или аналогично) или (предпочтительно) использовать DefaultTreeModel.insertNodesInto
метод
DefaultTreeModel model = (DefaultTreeModel)accessPointTree.getModel();
DefaultMutableTreeNode root = model.getRoot();
model.insertNodeInto(accessPointNode, root, root.getChildCount());
Другие советы
Вполне вероятно, что у вас возникнут проблемы с потоком. Ваша JTree обновлена, это какой -то поток, но важная копия JTree, которая отображается в потоке диспетчерского потока событий (EDT), ничего не знает об этих изменениях.
Если это так, вы должны обновить JTree в EDT Swing:
SwingUtilities.invokeLater(new Runnable() {
@Override public void run() { ... update jTree here }
});
Я не знаю о Jtree ... Может быть, это TreeModel, который вы должны обновить в Swing EDT.