【问题标题】:Java Swing JTree TreeModel - how to do lazy inializationJava Swing JTree 树模型 - 如何进行延迟初始化
【发布时间】:2011-08-16 07:47:39
【问题描述】:

我的 Swing 应用程序中有一个 JTree,用于显示 long 数据列表(int 树模式)。

问题是 TreeModel 在初始化期间加载了所有项目,我不需要全部加载。在一个屏幕中只能显示其中的 100 个,因此没有必要加载数千个数据以在一个屏幕中仅显示其中的 100 个。

问题:有什么方法可以在 TreeModel 中进行惰性初始化并在需要时检索数据?

谢谢大家

【问题讨论】:

    标签: java swing jtree treemodel


    【解决方案1】:

    TreeWillExpandListener 参见例如this

    【讨论】:

    • @StanislavL:问题是当我将模型设置为树时,它会立即检索所有记录(几乎 2000 条记录),甚至在显示它们之前。
    • @StanislavL +1 不错的答案我可以看到您如何将其用于此目的。
    • @mohammad shamsi 能否请您分享代码以便我可以使用它我讨厌从头开始。我对可复制的解决方案感兴趣,以供将来参考。
    • @mohammad shamsi 您可以只填充树的第一级并在展开之前检索单击节点的子节点。
    • @Stnislavl 问题是我在树的第一级有超过 10 万个项目。
    【解决方案2】:

    我假设您使用的是 DefaultTreeModel。

    我通过实现自定义TreeModel 解决了这样的问题。它可能看起来很复杂,但一旦你进入它,你就会发现它并没有那么糟糕。你只有 8 种方法可以实现,如果你已经有一个树状数据结构,它们中的大多数都是非常简单的。

    这种方法的主要好处是您可以完全控制底层模型。

    【讨论】:

    • @Maman:我有自定义 TreeModel,但结果还是一样。在 JTree 中设置模型后立即检索所有树节点。
    • 你的树结构如何?你有一个有 10K 直系孩子的根吗?
    • @Maman:是的,差不多就是这样,我的根有超过 20K 的直系子女。
    • 那么您可能超出了 JTree 的能力,这不是因为数据的大小,而仅仅是因为子节点的数量。我建议您破解一个自定义模型,该模型生成 20K 子代,而无需在幕后实际创建对象(使用 Integer 作为您的对象,并使 Integer 0 成为 1..20K 中所有 Integers 的根),看看它如何影响性能问题。
    • @Maman 与你的建议测试,我有时仍然内存不足(即使是第一级检索)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多