也许使用 'nodeChanged()' 而不是 'reload()' 可以获得你想要的效果。
DefaultTreeModel 类上有一堆方法,可以导致树的各个部分被改变和重绘。还有其他 DefaultTreeModel 上的方法只会导致重新绘制发生。
你提到了 'reload(node)' 并评论说它在调用时会导致树折叠。'reload' 会导致从该节点开始完全重绘整个子树。(但如果该节点不可见,则什么也不会改变。)这被称为“结构更改”。
'insertNodeInto()' 和 'removeNodeFromParent()' 通过添加或删除节点并绘制来修改树的结构。
我认为你需要使用的是 'nodeChanged()',因为它只是通知模型节点中有东西发生了变化,将导致其显示方式不同。也许可显示的文本现在与之前不同。也许您已更改节点中的用户对象。这就是在节点上调用 'nodeChanged()' 的时候。
你应该在自己的代码中尝试使用 'nodeChanged()' 来代替 'reload()' 调用,而在 vels4j 提供的示例程序中也是如此。这可能解决问题。
请注意,DefaultTreeModel 上还有另外两组方法,用于其他情况:
这些方法与树节点一起工作,并使用树路径来定义更改发生的位置。它们不会更改树下面的数据结构,但会通知模型发生了某些更改,以便它可以通知听众实际重新绘制事物或以其他方式响应更改。
nodesWereInserted()
nodesWereRemovde()
nodesChanged()
nodeStructureChanged()
还有一组
fire...()
方法,用于 DefaultTreeModel 和您可能创建的任何子类内部使用。它们只是通知任何监听器发生了某些更改。请注意它们是受保护的。
DefaultTreeModel.reload()
来更新我的JTree
模型时,节点会折叠。我该如何更新特定节点而不使其他具有子节点的节点折叠? - David BtreeStructureChanged()
而不是treeNodesChanged()
时,我遇到了令人讨厌的节点意外折叠。请参见此答案以获取详细信息,特别是其中的最后一部分,包括更改节点的示例。但是,我没有使用DefaultXXX
的东西。无论如何,请展示你的代码。 - Dmitry Frank