在向基础模型添加一些节点后,如何刷新 JTree?
首先,让我说我不使用DefaultTreeModel。我实现了我自己的树模型,所以我不能使用DefaultXXX的东西。问题是这样的:通过我的模型定义的一些addStuff()方法,我将节点添加到底层数据结构中。然后,我通过在addStuff()函数中调用treeNodesChanged()来通知听众(我知道有treeNodesInserted方法,但它是一回事。它只是用不同的方法通知听众)。现在,其中一个侦听器是我的主窗体中的静态类,这个侦听器可以告诉 JTree(它也包含在我的主窗体中)自行刷新。如何告诉 JTree 从模型中“重新加载”其部分或全部节点?
更新:发现这个问题虽然不完全相同,但它给出了我想要的答案。
更新2:我的问题不在于如何通知查看器(JTree),而在于在收到模型通知后应以何种方式重新加载jtree。
首先让我说,我知道刷新树以反映底层更改的唯一方法是调用updateUI(),或重用setModel()方法。从本质上讲,我的问题是这样的:
假设树模型管理器刚刚收到通知(通过树模型管理器 API),模型中发生了更改。好吧,现在该怎么办?
我有这个问题,因为JTree没有实现TreeModelListener。因此,在我的情况下,监听器是JTree的容器,或者是实现监听器的内部类,与Jtree位于同一容器下。
所以假设我是一个TreeModelListener实现,和我的兄弟JTree一起快乐地生活在JForm中。突然,我的方法树NodesInserted(TreeModelEvent evt)被调用。我现在该怎么办?如果我从内部调用Jtree.updateUI(),那么模型的侦听器List会抛出并发修改异常。我可以调用 updateUI 以外的其他内容吗?
我尝试了许多方法,但只有 updateUI 刷新了 JTree。所以我在听众之外做了这件事。从JForm中,我只调用模型的方法,该方法更改了undrlying结构,然后我调用了updateUI。没有使用树模型列表。
更新3:我发现有隐式的TreeModelListeners注册。在我模型的addTreeModelListener(TreeModelListener listener)实现中,我放了一个调试system.out行:
System.out.println("listener added: " + listener.getClass().getCanonicalName());
当我执行jTree.setModel(model)时,我看到了这个调试输出:
听众添加: javax.swing.JTree.TreeModelHandler
listener add: javax.swing.plaf.basic.BasicTreeUI.Handler
ConcurrentModificationException的原因是调用jtree.updateUI()重新注册了监听器(只有plav,而不是两者),所以当我在监听器通知循环中调用updateUI时,它会被抛出。现在刷新树的唯一方法是在 TreeModelListener 之外执行此操作。对更好的解决方案有任何意见或想法吗?我错过了什么吗?