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

Dav*_*lle 5 java swing jtree

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

我发现的问题是:

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

  2. getChildCount()需要执行可能昂贵的操作的儿童的准确计数

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

对孩子进行枚举可能既昂贵又耗时,我对此表示同意。但我不喜欢getChildCount()需要知道孩子的确切数量。

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

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

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

Dav*_*lle 0

解决方案分为几个部分:

  • 就像 Lorenzo Boccaccia 所说,使用TreeWillExpandListener

  • 另外,需要在树上调用nodesWereInserted,以便显示正确的节点数。 看这段代码

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