2010-09-29 129 views
8

我在我的GUI中使用了JTree并将其添加到JFrame中。当我想更新它并在程序的另一部分中更改它的节点时(程序运行时,执行操作时),我尝试添加新节点或删除节点;但我的界面不会改变。请给我一个解决方案。在Java GUI中更新JTree

问候

回答

15

除了insertNodeInto建议你也可以使用:

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

非常感谢您的宝贵回答!每次我想更新我的树,我使用这种方法。 – sajad 2010-09-30 12:42:16

+3

这会起作用,但在处理大树时是一种“强力”方法。例如,如果我要循环并将1000个节点添加到已包含50,000个项目的树中,则效率非常低。 – Adamski 2010-10-05 16:30:39

+1

在野外多久树会变得足够大,以至于变得足够慢而担心? – 2015-08-16 22:53:21

2

你需要确保更新模型后您指示它开火事件造成被通知该事件的任何注册的侦听。其中一名听众将是JTree,并在收到活动后重新绘制。

例如,DefaultTreeModel包含方法:你需要确保你是在事件指派更新模型

nodeChanged nodesChanged nodeStructureChanged nodesWereInserted nodesWereRemoved

此外,与所有Swing编程线程

+1

你不必自己解开这些事件。你所要做的就是通过调用'insertNodeInto'方法来更新模型,并让模型负责将事件触发到TreeModelListeners。 – dogbane 2010-09-29 13:28:52

+1

好点,虽然在某些情况下最好自己管理它。例如,如果我想添加1000个子节点,我不希望激发1000个“节点被添加”事件。 – Adamski 2010-09-29 14:13:11

+0

谢谢,先生!但是你提到的这些方法是私有的,无法访问。 – sajad 2010-09-30 12:43:41

-1

你的意思是GUI方面只是没有显示你的改变?你应该看看int repaint()revalidate().

Here's很好的描述何时调用哪一个。

+0

是的,调用这个方法是必要的。 – sajad 2010-09-30 12:44:33

+4

-1,不需要repaint()和revalidate()。当您使用模型时,模型负责通知更改的视图,以便树可以重新绘制自己。 – camickr 2010-09-30 14:42:23