【问题标题】:Java TreeNode: How to prevent getChildCount from doing expensive operation?Java TreeNode:如何防止 getChildCount 进行昂贵的操作?
【发布时间】:2010-09-14 08:44:02
【问题描述】:

我正在编写一个 Java 树,其中树节点可能有需要很长时间来计算的子​​节点(在这种情况下,它是一个文件系统,其中可能存在网络超时,从而阻止从附加的文件中获取文件列表驱动器)。

我发现的问题是这样的:

  1. getChildCount() 在用户特别请求打开树的特定分支之前被调用。我相信这样做是为了让JTree 知道是否在节点旁边显示 + 图标。

  2. 来自getChildCount() 的儿童的准确计数需要执行可能代价高昂的操作

  3. 如果我伪造了getChildCount() 的值,那么在请求枚举子节点之前,树只会为那么多子节点分配空间。 (如果我返回“1”,我只会看到列出的 1 个孩子,尽管还有更多)

孩子的枚举可能既昂贵又耗时,我可以接受。但我不同意getChildCount() 需要知道孩子的确切数量。

有什么办法可以解决这个问题?

补充:另一个问题是,如果其中一个节点代表一个软盘驱动器(多么古老!),驱动器将在用户请求其文件之前被轮询;如果驱动器中没有磁盘,则会导致系统错误。

更新:不幸的是,实现TreeWillExpand 侦听器不是解决方案。这可以让您否决扩展,但显示的节点数仍受TreeNode.getChildCount() 返回的值的限制。

【问题讨论】:

    标签: java swing jtree


    【解决方案1】:

    http://java.sun.com/docs/books/tutorial/uiswing/components/tree.html#data

    向下滚动一点,这里有关于如何为 jtree 创建延迟加载节点的确切教程,并附有示例和文档

    【讨论】:

      【解决方案2】:

      我不确定它是否完全适用,但我最近通过预先计算通常需要遍历子列表的方法的答案来解决树慢的问题。我只在添加、删除或更新孩子时重新计算它们。在我的例子中,一些方法必须递归地沿着树向下走,以找出每个节点的“存储了多少字节”之类的东西。

      【讨论】:

        【解决方案3】:

        如果您需要大量访问您的数据结构中计算成本很高的特定功能,那么预先计算它可能是有意义的。

        对于 TreeNode,这意味着您的 TreeNode 必须存储其子节点数。更详细地解释一下:当您创建一个节点 n0 时,此节点的子节点数 (cc) 为 0。当您添加节点 n1 作为此节点的子节点时,您将 n1.cc + cc++

        棘手的一点是删除操作。您必须保持与父节点的反向链接并向上层级减去当前节点的cc

        如果您只想为您的节点使用hasChildren 功能或覆盖getChildCount,则布尔值可能就足够了,并且不会强迫您在被删除的情况下进入整个层次结构。或者你可以删除反向链接,只是说你在删除操作上失去了精度。 TreeNode 接口实际上并不强制您提供删除操作,但您可能还是想要一个。

        嗯,就是这样。为了得出预先计算的精确值,您必须保留某种类型的反向链接。如果你不这样做,你最好调用你的方法hasHadChildren或更有趣的isVirgin

        【讨论】:

          【解决方案4】:

          解决方案有几个部分:

          • 就像 Lorenzo Boccaccia 所说,使用 TreeWillExpandListener

          • 另外,需要在树上调用nodesWereInserted,这样才会显示正确的节点数。 See this code

          • 我确定如果不知道child count,TreeNode.getChildCount()至少需要返回1(不能返回0)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-06-24
            • 1970-01-01
            • 2010-12-15
            • 2013-06-16
            • 2011-03-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多