在Java GUI中更新JTree

10

我在GUI中使用了JTree并将其添加到JFrame。 当我想要在程序的另一部分(当程序正在运行时,作为操作执行)更新它并更改其节点时,我尝试向其中添加新节点或删除节点。 但是我的界面没有更改。 请建议一个解决方案。

问候

3个回答

16

除了使用insertNodeInto的建议之外,您还可以使用:

DefaultTreeModel model = (DefaultTreeModel)tree.getModel();
DefaultMutableTreeNode root = (DefaultMutableTreeNode)model.getRoot();
root.add(new DefaultMutableTreeNode("another_child"));
model.reload(root);

1
非常感谢您宝贵的回答!每次我想要更新我的树时,我都会使用这种方法。 - sajad
3
这个方法可以用,但处理大型树时会显得很“蛮力”。例如,如果我要循环并向已包含50,000个项目的树中添加1000个节点,这将非常低效。 - Adamski
1
在实际应用中,树的大小有多大才会变得足够缓慢,以至于需要担心它的性能问题? - Kevin Kostlan

2

1
您不必自行触发这些事件。您只需要通过调用“insertNodeInto”方法来更新模型,然后让模型负责向TreeModelListeners触发事件即可。 - dogbane
1
好观点,尽管在某些情况下自己管理可能更好。例如,如果我想添加1000个子节点,我不希望触发1000个“节点已添加”事件。 - Adamski
谢谢您先生!但是您提到的这些方法是私有的,无法访问。 - sajad
你说得完全正确!我已经更改了我的答案以反映出应该调用的正确公共方法。 - Adamski

-1

你的意思是GUI方面没有显示你的更改吗?你应该看一下repaint()revalidate()

这里有一个很好的描述,说明何时调用哪个方法。


是的,调用这些方法是必要的。 - sajad
4
不需要调用repaint()和revalidate()方法。当你更新模型时,模型会通知视图进行更改,因此树形结构可以重新绘制自己。 - camickr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接