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

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

问候

【问题讨论】:

    标签: java jtree


    【解决方案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 个项目的树中,这将非常低效。
    • 在野外,树多久变大到足以让这变得慢到可以担心的频率?
    猜你喜欢
    • 2011-03-28
    • 1970-01-01
    • 2012-06-22
    • 2015-11-17
    • 2013-12-23
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多