4

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

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

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

如何做呢?

注 1:所有这些DefaultMutableTreeNodes 都是在invokeAndWait.
注意 2:当我invokeAndWaitinvokeLater树替换时不会更新。
注意 3:发现递归树扩展花费的时间最多。
注 4:我正在使用自定义树单元格渲染器,将尝试不使用并报告。
注意 4a:我的树单元渲染器使用映射来缓存和重用创建JTextComponent的 s,具体取决于树节点(作为键)。

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

本教程涉及延迟加载可能会有所帮助,我将完成此操作。

4

2 回答 2

2

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

无论如何,过去对我有用的东西(当我因 JTree 更新而经历显着放缓时)是我推出了自己的 TreeModel。

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

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

于 2010-04-07T11:01:11.843 回答
1

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

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

于 2010-04-07T11:03:16.593 回答