3

以下行:

SwingUtilities.updateComponentTreeUI(aComponent);

使我的 GUI 无响应。

当调用此方法更新大部分 GUI 上的 laf 时,会花费大量时间,因此在此操作期间会使 GUI 无响应。

由于此操作正在操作 GUI,因此也不能为此使用 SwingWorker。从 SwingWorker 文档:

  • 不应在事件调度线程上运行耗时的任务。否则应用程序变得无响应。

  • Swing 组件只能在 Event Dispatch Thread 上访问。

但这里的问题是该操作正在访问 Swing 组件并且非常耗时。

有没有防止这种反应迟钝的好方法?

4

2 回答 2

2

由于您所做的是更改 L&F,这可能会严重影响 GUI 的外观和可用性,因此请问问自己是否真的希望应用程序在此期间响应。使用玻璃窗格显示消息(“请稍候...”或其他内容)可能会更好,并在 L&F 更新时冻结 GUI。

现在,正如其他人所建议的那样,您可能想要调查为什么更新组件树如此缓慢。

于 2011-05-04T11:25:41.267 回答
0

我将建议通过您的 GUI 来识别任何自定义或第三方组件,这些组件包含许多子组件,或者具有任何不寻常或低效的方法来重新验证自身。看起来情况就是这样,正如您提到的日期选择器是一个严重的瓶颈。

您建议将调用拆分为updateComponentTree允许事件发生在其间的几个子任务,这可能是一个“黑客”,但还不错,除非字体的更改改变了元素的大小并可能导致用户错过一个按钮等

如果可能的话,我建议查看日期选择器组件中的代码,看看是否可以重写它,这样它就不会在弹出窗口中隐藏组件,而是实际删除/处置它们,并在必要时重新创建它们。这应该对日期选择器在使用时的响应没有明显影响,但是当弹出窗口不可见时肯定会加快组件树的更新。

于 2011-05-04T10:56:22.523 回答