繁体   English   中英

用于在工作线程中阻止Java Swing用户的模式

[英]Pattern for blocking Java Swing user in worker thread

正如大多数Java程序员所知,Swing GUI的更新只应在AWT事件调度线程上完成,建议在“worker”线程上执行长时间运行的进程,并使用SwingUtilities.invokeAndWait()将更新发送到事件调度线程。 SwingUtilities.invokeAndWait()SwingUtilities.invokeLater()

在长时间运行的过程完成后,如何阻止用户继续执行应用程序? 你是否使控件变灰,然后使用上面提到的SwingUtilities调用让工作线程重新启用它们?

有更好的替代模式吗?

我会考虑3个解决方案:

  • 禁用面板的组件 :这通常是我做的。 不幸的是,Swing没有提供一种简单的方法来禁用面板及其所有子节点,但是很容易进行递归(请参阅其他的SO答案 )。 另一个问题是一些Swing组件在启用和禁用时看起来相同(例如JList)
  • 隐藏与CardLayout面板 :在具有一个面板CardLayout ,加2级的组件。 第一个是托管要停用的组件的面板,第二个是显示“加载”或“请稍候”消息的面板。 Gridbaglayout中的一个简单的JLabel可以Gridbaglayout问题。 然后,你只需要从一个切换到另一个。 我将此技术用于要显示计算/请求结果的位置。
  • 在面板上放置一些消耗鼠标事件的组件 :您可以使用LayeredPane自己LayeredPane ,也可以使用专用实用程序。 JXLayer可以做到这一点(我读到JXLayer将包含在Java 7中,因此这可能成为解决此类问题的'标准')。

有几种方法和选择方式,主要取决于GUI的设计和布局。

  • 使用进度条 - 替换面板或您不希望用户触摸进度条的区域。 这样可以防止您不得不处理您不想要的事件,同时仍然向用户表明后台发生了某些事情。
  • 禁用按钮并添加等待光标 - 在工作完成时使用setEnable(false)并且可能将光标更改为等待光标。 这再次清楚地表明,只有临时期限才能提供选项。
  • 不要响应事件或抛出GlassPane - 这不是用户友好,因为它使应用程序看起来没有响应,但在某些情况下它是可以接受的。

我看到它完成的一种方法是使用Jframe.setGlassPane()并设置一个吃掉所有事件的组件。 你也可以有创意,并在你的玻璃板上使用闪光等旋转等待gif。 但请注意,设置玻璃窗格可能不是您想要的。 对于更高级的要求,您可能需要使用事件队列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM