JavaTreeNode:如何防止getChildCount执行昂贵的操作?

JavaTreeNode:如何防止getChildCount执行昂贵的操作?,java,swing,jtree,Java,Swing,Jtree,我正在编写一个Java树,其中树节点的子节点可能需要很长时间来计算(在本例中,它是一个文件系统,其中可能存在网络超时,从而阻止从连接的驱动器获取文件列表) 我发现的问题是: getChildCount()在用户明确请求打开树的特定分支之前被调用。我相信这样做是为了JTree知道是否在节点旁边显示+图标 要从getChildCount()准确计数子级,需要执行可能代价高昂的操作 如果我伪造getChildCount()的值,则在请求子节点枚举之前,树只为那么多子节点分配空间。(如果我返回'1',我

我正在编写一个Java树,其中树节点的子节点可能需要很长时间来计算(在本例中,它是一个文件系统,其中可能存在网络超时,从而阻止从连接的驱动器获取文件列表)

我发现的问题是:

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

  • 要从
    getChildCount()
    准确计数子级,需要执行可能代价高昂的操作

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

  • 对孩子的列举可能既昂贵又耗时,我同意这一点。但是我不同意
    getChildCount()
    需要知道孩子的确切数量

    我能解决这个问题吗

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


    更新:不幸的是,实现
    TreeWillExpand
    侦听器不是解决方案。这可以允许您否决扩展,但显示的节点数仍然受到
    TreeNode.getChildCount()返回的值的限制,我不确定它是否完全适用,但我最近通过预先计算通常需要遍历孩子列表的方法的答案,解决了一个慢速树的问题。我只在添加、删除或更新子项时重新计算它们。在我的例子中,有些方法必须递归地沿着树向下,以计算出每个节点的“存储了多少字节”之类的内容。

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

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

    棘手的一点是删除操作。您必须保留到父节点的反向链接,并向上移动层次结构以减去当前节点的
    cc

    如果您只想为节点使用a
    haschilds
    功能或覆盖
    getChildCount
    ,那么布尔值可能就足够了,在删除时不会强制您向上移动整个层次结构。或者,您可以删除反向链接,只说您在删除操作中失去了精度。
    TreeNode
    接口实际上并不强迫您提供删除操作,但您可能还是想要一个

    好吧,就这么定了。为了得到预先计算的精确值,您必须保持某种类型的反向链接。如果你没有,你最好调用你的方法
    hasHadChildren
    或者更有趣的
    isVirgin


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

    解决方案有几个部分:

    • 就像Lorenzo Boccacia说的,使用

    • 此外,还需要调用树上插入的nodeswereinsert,以便显示适当数量的节点

    • 我已经确定,如果您不知道子计数,TreeNode.getChildCount()需要至少返回1(它不能返回0)