Почему мой JTree не обновляется, когда TreeModel добавляет новые узлы? - PullRequest
3 голосов
/ 26 июля 2011

Я использую 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...
}

Я могу включить код, где я создаю узел, если это необходимо, но я не думаю, что это проблема.

Ответы [ 2 ]

7 голосов
/ 26 июля 2011

Проблема в том, что DefaultMutableTreeNode не сообщает DefaultTreeModel, что его дочерние элементы были обновлены. Для этого вам нужно либо вызвать соответствующий метод в табличной модели (nodesChanged или аналогичный), либо (предпочтительно) использовать метод DefaultTreeModel.insertNodesInto.

DefaultTreeModel model = (DefaultTreeModel)accessPointTree.getModel();
DefaultMutableTreeNode root = model.getRoot();
model.insertNodeInto(accessPointNode, root, root.getChildCount());
0 голосов
/ 26 июля 2011

Вполне вероятно, что у вас возникла проблема с многопоточностью. Ваше JTree обновлено в некотором потоке, но важная копия JTree, та, которая отображается в потоке диспетчеризации событий Swing (EDT), ничего не знает об этих изменениях.

Если это так, вы должны обновить JTree в Swing EDT, используя:

SwingUtilities.invokeLater(new Runnable() {
  @Override public void run() { ... update jTree here }
});

Я не знаю о JTree ... может быть, это TreeModel, которую вы должны обновить в Swing EDT.

...