当TreeModel添加新节点时,为什么我的JTree不会更新?

时间:2011-07-26 14:05:20

标签: java swing jtree treemodel

我正在使用填充了DefaultTreeModel的{​​{1}},它支持可选地更改树中节点的显示字符串。如下面的代码所示,在我的表单中,我通过在一个单独的类中创建它们然后通过我的主数据类型的包装类传递它们来为新节点填充树。其中的过程是创建一个新的重写DefaultMutableTreeNode,向其添加子项(每个DefaultMutableTreeNode由具有多个子节点的节点表示),然后将其存储以供以后在UI中使用。

我第一次以这种方式添加节点时,它的工作效果非常好。添加了以下代码的任何后续节点实际上都存储在AccessPoint中,但DefaultTreeModel未使用新节点进行更新。

为什么在添加第一个孩子后才会填充JTree

JTree

我可以在必要时包含我创建节点的代码,但我不认为这是问题。

2 个答案:

答案 0 :(得分:7)

问题是DefaultMutableTreeNode没有通知DefaultTreeModel其子女已更新。为此,您要么想要在表模型中调用适当的方法(nodesChanged或类似方法),要么(最好)使用DefaultTreeModel.insertNodesInto方法。

DefaultTreeModel model = (DefaultTreeModel)accessPointTree.getModel();
DefaultMutableTreeNode root = model.getRoot();
model.insertNodeInto(accessPointNode, root, root.getChildCount());

答案 1 :(得分:0)

您很可能遇到一些线程问题。你的JTree更新是一些线程,但是JTree的重要副本,即Swing事件调度线程(EDT)中显示的那个,对这些更改一无所知。

如果是这种情况,您必须使用以下命令更新Swing EDT中的JTree:

SwingUtilities.invokeLater(new Runnable() {
  @Override public void run() { ... update jTree here }
});

我不知道JTree ......也许是你必须在Swing EDT中更新的TreeModel。