Прежде всего, позвольте мне сказать, что я не использую DefaultTreeModel. Я реализую свой собственный TreeModel, поэтому я не могу использовать материал DefaultXXX. Проблема заключается в следующем: с помощью некоторых методов addStuff(), которые определяет моя модель, я добавляю узлы в базовую структуру данных. Затем я уведомляю слушателей, вызывая treeNodesChanged() внутри функции addStuff() (я знаю, что есть методы treeNodesInserted, но это то же самое, он просто уведомляет слушателей другим способом). Теперь один из слушателей - это статический класс в моей основной форме, и этот слушатель может рассказать JTree, который также содержится в моей основной форме, для обновления самого себя. Как сообщить JTree "перезагрузить" некоторые или все его узлы из модели?
UPDATE: Найденный question, хотя это не совсем то же самое, он дает ответ, который я хочу.
ОБНОВЛЕНИЕ 2: Моя проблема заключалась не в том, как уведомить зрителя (JTree), а скорее о том, каким образом jtree будет перезагружаться после уведомления из модели.
Прежде всего позвольте мне сказать, что единственный способ узнать дерево, чтобы отразить основные изменения, - вызвать updateUI() или повторно использовать метод setModel(). По сути, моя проблема заключается в следующем:
Предположим, что TreeModelListener только что был уведомлен (через API TreeModelListener), что изменение произошло в модели. Хорошо, что теперь?
У меня есть эта проблема, потому что JTree не реализует TreeModelListener. Таким образом, слушателем в моей ситуации является контейнер JTree или внутренний класс, реализующий Listener, живущий в том же контейнере, что и Jtree.
Итак, предположим, что я - реализация TreeModelListener, живущей счастливо в JForm с моим братом JTree. Внезапно вызывается мой метод treeNodesInserted (TreeModelEvent evt). Что мне теперь делать? Если я вызову Jtree.updateUI() изнутри меня, то список прослушивателей моделей выдает ConcurrentModification Exception. Могу ли я вызвать что-то другое, кроме updateUI?
Я пробовал несколько вещей, но только updateUI обновил JTree. Поэтому я сделал это за пределами слушателя. Из JForm я просто вызываю метод модели, который изменяет структуру, остающуюся без ссылки, а затем я вызываю updateUI. Нет использования TreeModelListener.
Update3: Я узнал, что зарегистрированы неявные данные TreeModelListeners. В моей модели addTreeModelListener (ресивер TreeModelListener) я установил строку отладки system.out:
System.out.println("listener added: " + listener.getClass().getCanonicalName());
и я увидел этот отладочный вывод, только когда я выполнил jTree.setModel(model):
прослушиватель добавлен: javax.swing.JTree.TreeModelHandler
прослушиватель добавлен: javax.swing.plaf.basic.BasicTreeUI.Handler
Ошибка ConcurrentModificationException вызвана тем, что вызов jtree.updateUI() повторно регистрирует слушателя (только плафон, а не оба), поэтому он возникает, когда я вызываю updateUI внутри цикла уведомления слушателя. Единственный способ обновить дерево - сделать это за пределами TreeModelListener. Любые комментарии или идеи для лучшего решения? Я что-то пропустил?