JavaTreeNode:如何防止getChildCount执行昂贵的操作?
我正在编写一个Java树,其中树节点的子节点可能需要很长时间来计算(在本例中,它是一个文件系统,其中可能存在网络超时,从而阻止从连接的驱动器获取文件列表) 我发现的问题是:JavaTreeNode:如何防止getChildCount执行昂贵的操作?,java,swing,jtree,Java,Swing,Jtree,我正在编写一个Java树,其中树节点的子节点可能需要很长时间来计算(在本例中,它是一个文件系统,其中可能存在网络超时,从而阻止从连接的驱动器获取文件列表) 我发现的问题是: getChildCount()在用户明确请求打开树的特定分支之前被调用。我相信这样做是为了JTree知道是否在节点旁边显示+图标 要从getChildCount()准确计数子级,需要执行可能代价高昂的操作 如果我伪造getChildCount()的值,则在请求子节点枚举之前,树只为那么多子节点分配空间。(如果我返回'1',我
getChildCount()
在用户明确请求打开树的特定分支之前被调用。我相信这样做是为了JTree
知道是否在节点旁边显示+图标getChildCount()
准确计数子级,需要执行可能代价高昂的操作getChildCount()
的值,则在请求子节点枚举之前,树只为那么多子节点分配空间。(如果我返回'1',我只会看到列出的1个孩子,尽管还有更多)getChildCount()
需要知道孩子的确切数量
我能解决这个问题吗
添加:另一个问题是,如果其中一个节点表示软盘驱动器(多么古老!),则在用户请求其文件之前,将轮询该驱动器;如果驱动器中没有磁盘,则会导致系统错误
更新:不幸的是,实现
TreeWillExpand
侦听器不是解决方案。这可以允许您否决扩展,但显示的节点数仍然受到TreeNode.getChildCount()返回的值的限制,我不确定它是否完全适用,但我最近通过预先计算通常需要遍历孩子列表的方法的答案,解决了一个慢速树的问题。我只在添加、删除或更新子项时重新计算它们。在我的例子中,有些方法必须递归地沿着树向下,以计算出每个节点的“存储了多少字节”之类的内容。如果您需要大量访问数据结构中计算成本高昂的特定功能,那么预计算它可能是有意义的
对于TreeNodes,这意味着您的TreeNodes必须存储其子计数。更详细地解释一下:当您创建一个节点n0
时,这个节点的childcount(cc
)为0。当您将节点n1
作为此节点的子节点添加时,您可以n1.cc+cc++
棘手的一点是删除操作。您必须保留到父节点的反向链接,并向上移动层次结构以减去当前节点的cc
如果您只想为节点使用ahaschilds
功能或覆盖getChildCount
,那么布尔值可能就足够了,在删除时不会强制您向上移动整个层次结构。或者,您可以删除反向链接,只说您在删除操作中失去了精度。TreeNode
接口实际上并不强迫您提供删除操作,但您可能还是想要一个
好吧,就这么定了。为了得到预先计算的精确值,您必须保持某种类型的反向链接。如果你没有,你最好调用你的方法hasHadChildren
或者更有趣的isVirgin
向下滚动一点,有关于如何为jtree创建延迟加载节点的确切教程,包括示例和文档解决方案有几个部分:
- 就像Lorenzo Boccacia说的,使用
- 此外,还需要调用树上插入的nodeswereinsert,以便显示适当数量的节点
- 我已经确定,如果您不知道子计数,TreeNode.getChildCount()需要至少返回1(它不能返回0)