Показать элемент управления «расширить» на узлах JTree после удаления детей?

У меня есть DefaultTreeModel, содержащий подкласс DefaultMutableTreeNode. Я только переопределил isLeaf(), чтобы он всегда возвращал true, потому что я лениво загружаю дочерние элементы, когда узел расширяется. Затем, когда узел рушится, я удаляю дочерние элементы (запуская соответствующее событие treeNodesRemoved), потому что я отписался от обновлений с сервера.

Проблема в том, что после того, как пользователь свернет узел и я удалю дочерние элементы, глупый маленький круг расширения исчезнет (но щелчок по этой области все еще работает, чтобы расширить узел). Как я могу всегда показывать элемент управления расширением, когда дети были удалены?

Связано: Добавить кнопку "расширить" к узлу JTree, который имеет нет детей?. Является ли добавление поддельного ребенка единственным способом?

Контроль расширения исчезает после свертывания


person yonran    schedule 06.07.2011    source источник
comment
Хм, в том, что вы сделали, нет ничего явно плохого, я предлагаю попробовать разные методы уведомления модели (и, следовательно, дерева) об изменении узла. Например, в вашем методе TreeExpansionListener.treeCollapsed вы можете вызвать defaultMutableTreeNode.removeAllChildren(), а затем defaultTreeModel.reload(defaultMutableTreeNode).   -  person Nate W.    schedule 07.07.2011
comment
Можете ли вы дать подробное объяснение удаления ребенка. зачем вам это? потому что я отписался от обновлений с сервера мне непонятно.   -  person MockerTim    schedule 07.07.2011
comment
@MockerTim, когда узел расширяется, я отправляю запрос на свой сервер, чтобы получить его дочерние элементы и подписаться на события вставки/удаления/изменения для его прямых дочерних элементов. Когда узел рушится, я отправляю серверу запрос на прекращение получения обновлений его дочерними элементами. Затем я удаляю всех дочерних элементов, так как не хочу оставлять узлы, которые могут быть устаревшими.   -  person yonran    schedule 07.07.2011


Ответы (1)


Я сделал это следующим образом: я добавил фальшивого дочернего элемента и слушателя расширения, когда дочерние элементы удаляются. Когда я получаю уведомление о том, что узел с поддельным дочерним элементом будет расширен, я заменяю поддельный дочерний элемент реальными лениво загружаемыми дочерними элементами.

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

person Eugene Ryzhikov    schedule 07.07.2011
comment
Вот что я в итоге сделал: создал поддельный дочерний элемент, а затем удалил его в treeWillExpand. Я надеялся, что isLeaf будет достаточно, но, видимо, это не так. - person yonran; 12.07.2011