以下一行:
SwingUtilities.updateComponentTreeUI(aComponent);
让我的GUI无法响应。
当调用此方法在GUI的大部分上更新laf时,需要花费大量时间,因此在此操作期间GUI无响应。
由于此操作正在操作GUI,因此无法使用SwingWorker。 从SwingWorker文档:
不应在Event Dispatch Thread上运行耗时的任务。 否则应用程序变为 不响应。
应在Event Dispatch Thread上访问Swing组件 仅
这里的问题是,操作是访问Swing组件和是非常耗时的。
有没有一种好方法可以防止这种反应迟钝?
答案 0 :(得分:2)
由于您所做的是更改L& F,这可能会严重影响GUI的外观和可用性,因此请问自己是否真的希望应用程序在此期间做出响应。最好使用glass pane显示消息(“请稍候......”等),并在更新L& F时冻结GUI。
现在,正如其他人所建议的那样,您可能想要调查为什么更新组件树的速度太慢。
答案 1 :(得分:0)
我打算建议通过GUI查找包含许多子组件的任何自定义或第三方组件,或者有任何异常或低效的方法来重新验证自身。看起来就是这种情况,因为你提到日期选择器是一个严重的瓶颈。
您建议将对updateComponentTree
的调用拆分为几个允许事件发生在其间的子任务,这可能是一个'黑客'但不是太糟糕,除非字体的更改改变了大小元素,可能会导致用户错过按钮等。
如果可能的话,我建议查看日期选择器组件中的代码,看看是否可以重写它,以便它不会隐藏弹出窗口中的组件,而是实际删除/处理它们,并在必要时重新创建它们。这应该对日期选择器在使用时的响应性没有明显影响,但当弹出窗口不可见时,肯定会加快组件树更新。