在调用同时访问Swing组件并且非常耗时的方法时,防止Swing GUI变得无响应

时间:2011-05-03 12:25:00

标签: java multithreading swing swingworker

以下一行:

SwingUtilities.updateComponentTreeUI(aComponent);

让我的GUI无法响应。

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

由于此操作正在操作GUI,因此无法使用SwingWorker。 从SwingWorker文档:

  
      
  • 不应在Event Dispatch Thread上运行耗时的任务。   否则应用程序变为   不响应。

  •   
  • 应在Event Dispatch Thread上访问Swing组件   仅

  •   

这里的问题是,操作是访问Swing组件是非常耗时的。

有没有一种好方法可以防止这种反应迟钝?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

我打算建议通过GUI查找包含许多子组件的任何自定义或第三方组件,或者有任何异常或低效的方法来重新验证自身。看起来就是这种情况,因为你提到日期选择器是一个严重的瓶颈。

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

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