Почему мой JTree не обновляется, когда TreeModel добавляет новые узлы?

StackOverflow https://stackoverflow.com/questions/6831269

  •  27-10-2019
  •  | 
  •  

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top