正如大多数Java程序员所知,Swing GUI的更新只应在AWT事件派发线程上完成,建议在“worker”线程上执行长时间运行的进程,并使用事件调度线程将更新发送到事件调度线程SwingUtilities.invokeAndWait()
或SwingUtilities.invokeLater()
。
在长时间运行的过程完成后,如何阻止用户继续使用该应用程序?你是否使控件变灰,然后让工作线程使用上面提到的SwingUtilities
调用重新启用它们?
是否有更好的替代模式?
答案 0 :(得分:3)
我会考虑3个解决方案:
CardLayout
的面板中,添加2个组件。第一个是托管要停用的组件的面板,第二个是显示“加载”或“请稍候”消息的面板。 JLabel
中的简单Gridbaglayout
可以解决问题。然后,你只需要从一个切换到另一个。我将这种技术用于显示计算/请求结果的地方。LayeredPane
自行完成,也可以使用专用实用程序。 JXLayer可以做到这一点(我读到JXLayer将包含在Java 7中,因此这可能成为解决此类问题的'标准')。答案 1 :(得分:2)
有几种方法和选择,主要取决于GUI的设计和布局。
答案 2 :(得分:0)
我看到它完成的一种方法是使用Jframe.setGlassPane()并设置一个吃掉所有事件的组件。你也可以有创意,并在你的玻璃板上使用闪光等旋转等待gif。但请注意,设置玻璃窗格可能不是您想要的。对于更高级的要求,您可能必须使用事件队列。