我正在编写一个 Java 树,其中树节点可能有需要很长时间来计算的子节点(在这种情况下,它是一个文件系统,其中可能存在网络超时阻止从连接的驱动器获取文件列表)。
我发现的问题是:
getChildCount()在用户特别请求打开树的特定分支之前调用。我相信这样做是为了JTree知道是否在节点旁边显示 + 图标。
getChildCount()需要执行可能昂贵的操作的儿童的准确计数
如果我伪造 的值getChildCount(),树只会在要求枚举子节点之前为那么多子节点分配空间。(如果我返回 '1',我只会看到 1 个孩子被列出,尽管还有更多)
对孩子进行枚举可能既昂贵又耗时,我对此表示同意。但我不喜欢getChildCount()需要知道孩子的确切数量。
有什么办法可以解决这个问题吗?
补充:另一个问题是,如果一个节点代表一个软盘驱动器(多么古老!),驱动器将在用户请求其文件之前被轮询;如果驱动器中没有磁盘,则会导致系统错误。
更新:不幸的是,实现TreeWillExpand监听器不是解决方案。这可以让您否决扩展,但显示的节点数仍受 返回值的限制TreeNode.getChildCount()。
解决方案分为几个部分:
就像 Lorenzo Boccaccia 所说,使用TreeWillExpandListener
另外,需要在树上调用nodesWereInserted,以便显示正确的节点数。 看这段代码
我已经确定,如果您不知道子计数,TreeNode.getChildCount() 需要至少返回 1(它不能返回 0)