也许如果你使用'nodeChanged()' 而不是'reload()' 你会得到你想要的效果。
DefaultTreeModel 类中有很多方法会导致树的各个部分被更改和重绘。DefaultTreeModel 上还有其他方法只会导致重绘发生。
您提到了“重新加载(节点)”并评论说当您调用它时它会导致树崩溃。'reload' 导致整个子树从该节点开始完全重绘。(但如果该节点不可见,则不会发生任何变化。)这称为“结构变化”。
'insertNodeInto()' 和 'removeNodeFromParent()' 通过添加或删除节点然后重绘来修改树结构。
我认为 'nodeChanged()' 是您需要的,因为它只是通知模型节点中的某些更改将导致它以不同的方式显示。也许可显示的文本现在与以前不同了。也许您更改了节点中的用户对象。那是您在节点上调用“nodeChanged()”的时候。
您应该在您自己的崩溃代码和提供的示例程序 vels4j 中尝试使用“nodeChanged()”来代替“reload()”调用。这可能会解决问题。
请注意,DefaultTreeModel 上还有另外两个用于其他情况的方法系列:
这些方法与树节点一起工作,并使用树路径来定义更改发生的位置。它们不会更改树下的数据结构,而是通知模型发生了某些更改,以便它可以通知实际重绘事物或以其他方式响应更改的侦听器。
nodesWereInserted()
nodesWereRemovde()
nodesChanged()
nodeStructureChanged()
还有一组fire...()
在 DefaultTreeModel 内部使用的方法以及您可以创建的任何子类。他们只是通知任何听众发生了一些变化。请注意,它们受到保护。