在 Java GUI 中更新 JTree

Posted

技术标签:

【中文标题】在 Java GUI 中更新 JTree【英文标题】:updating JTree in java GUI 【发布时间】:2011-04-18 19:38:16 【问题描述】:

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

问候

【问题讨论】:

【参考方案1】:

您需要确保在更新模型后指示它触发一个事件,以使所有已注册的侦听器都收到该事件的通知。其中一位听众是JTree,在收到事件后它将重新绘制。

例如,DefaultTreeModel 包含方法:

nodeChanged nodesChanged nodeStructureChanged nodesWereInserted nodesWereRemoved

此外,与所有 Swing 编程一样,您需要确保在 Event Dispatch Thread 上更新模型。

【讨论】:

您不必自己触发这些事件。您所要做的就是通过调用 insertNodeInto 方法来更新模型,例如,让模型负责向 TreeModelListeners 触发事件。 好点,虽然在某些情况下最好自己管理。例如,如果我想添加 1000 个子节点,我不希望触发 1000 个“添加节点”事件。 谢谢先生!但是你提到的这些方法是私有的,无法访问。 你说得对!我已更改答案以反映您应该调用的正确公共方法。【参考方案2】:

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

Here's 很好地描述了何时调用哪个。

【讨论】:

是的,调用这个方法是必要的。 -1,不需要 repaint() 和 revalidate()。当您更新模型时,模型负责通知视图更改,以便树可以重新绘制自己。【参考方案3】:

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

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

【讨论】:

感谢您的宝贵回答!每次我想更新我的树时,我都会使用这种方法。 这会起作用,但在处理大树时是一种“蛮力”方法。例如,如果我要循环并将 1000 个节点添加到已经包含 50,000 个项目的树中,这将非常低效。 在野外,树多久变大到足以让这变得慢到可以担心的频率?

以上是关于在 Java GUI 中更新 JTree的主要内容,如果未能解决你的问题,请参考以下文章

JTree 更新节点而不折叠

重新选择文件时Java JTree冻结

无法在 JInternalFrame GUI 组件中更新标题

Java:具有后台线程的 GUI 应用程序

如何从 Java 中的另一个线程更新 SWT GUI

java swingworker线程更新main Gui