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