【问题标题】:Swing: what to do when a JTree update takes too long and freezes other GUI elements?Swing:当 JTree 更新时间过长并冻结其他 GUI 元素时该怎么办?
【发布时间】:2011-02-05 05:04:16
【问题描述】:

我知道Java Swing中的GUI代码必须放在里面 SwingUtilities.invokeAndWaitSwingUtilities.invokeLater。 这种方式线程工作正常。

遗憾的是,在我的情况下,GUI 更新它的时间比后台线程要长得多。更具体地说:我更新了一个只有大约 400 个条目的 JTree,嵌套深度最大为 4,所以应该没什么可怕的,对吧?但有时需要一秒钟!我需要确保用户能够毫无延迟地输入 JTextPane。好吧,猜猜看,缓慢的 JTree 更新确实会导致 JTextPane 在输入期间出现延迟。仅在树更新后才会刷新。

我正在使用 Netbeans,并且凭经验知道 Java 应用程序可以更新大量信息,而不会冻结 UI 的其余部分。

怎么做?

注意 1:所有 DefaultMutableTreeNodes 都是在 invokeAndWait 之外准备的。
注意 2:当我将 invokeAndWait 替换为 invokeLater 时,树不会' t 得到更新。
注意 3:递归树扩展花费的时间最多。
注意 4:我正在使用自定义树单元渲染器,将尝试不使用并报告。
注意 4a:我的树单元格渲染器使用地图缓存和重用创建的 JTextComponents,具体取决于树节点(作为键)。

线索 1:哇! 如果不设置自定义单元格渲染器,它会快 10 倍。我想,我需要一些关于编写自定义树单元渲染器的好教程。遗憾的是,我需要自定义单元格渲染器。

This tutorial involving lazy loading might help, I'll work this through.

【问题讨论】:

  • 如果你能发布一些代码就太好了。
  • 您是否正在显示 JTree 的所有内容?如果没有,添加一个可以处理延迟加载的方法怎么样?

标签: java multithreading user-interface swing swingworker


【解决方案1】:

[缺少一些细节,例如:用户每次更新 JTextPane 时都在发生什么类型的处理?整棵树都在重建吗?]

无论如何,过去对我有用的方法(当我因 JTree 更新而显着减速时)是我推出了自己的 TreeModel。

大多数程序员选择使用 DefaultTreeModel。这确实是一种现成的解决方案,在大多数情况下都能很好地工作。但是,当需要更新树的重要部分时,它会很慢。显然,编写自己的 TableModel 比使用固定解决方案要工作更多,但它并没有你想象的那么痛苦。

特别是,我的自定义树模型速度很快,因为它本身不构建任何树。它只是观察我的域模型并通过从该模型中提取相关信息来计算对其调用的方法(getChild()、getParent()、...)的答案。试试吧。它就像一个魅力。

【讨论】:

【解决方案2】:

我不知道为什么它只适用于invokeAndWait()(这很奇怪),但一个简单的技巧是在新的后台线程中调用此方法。

我还建议您不要一次填充所有树。这通常是一项无法轻易加速的大量工作。相反,只更新那些可见的节点,并在用户展开它们时更新更多节点。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-12-16
  • 1970-01-01
  • 2014-04-09
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多