非阻塞模式 Swing 进度对话框

Posted

技术标签:

【中文标题】非阻塞模式 Swing 进度对话框【英文标题】:Non-blocking modal Swing progress dialog 【发布时间】:2011-04-22 14:59:14 【问题描述】:

一个愚蠢的问题,但我真的无法让它工作:我在 Swing 应用程序中有一些长时间运行的进程,可能需要几分钟。我想在此过程进行时向用户显示进度对话框。我还想阻止用户执行进一步的操作,例如在进程进行时按下按钮。

如果我在 EDT 上执行该过程,这显然会阻止最终用户在该过程进行时执行任何操作。但是因为 EDT 正忙于处理,它从来没有时间渲染对话框的内容,所以我只得到了对话框的轮廓。

但如果我在工作线程中执行该过程,最终用户可以单击按钮并导致 EDT 操纵工作人员同时也在操纵的状态,坏东西为一个后果。如果我将对话框设为模态,则不会发生,但 Swing 中的 modal 也意味着 阻塞,所以当我调用 setVisible(true) 时,线程将永远阻塞。

所以我目前的“解决方案”是使用一个工作线程,然后产生一个单独的线程,其唯一目的是吸收setVisible 的阻塞特性。肯定有更好的解决方案!

那么我如何获得一个对话框来阻止用户与系统的其余部分(模态)交互但不阻塞导致它可见的线程?

【问题讨论】:

另见:***.com/questions/3954120/… 【参考方案1】:

您应该使用 GlassPane 来阻止用户进行交互。好消息是这是对用户而不是您的程序的模态,因此您的线程不会被阻塞。

好消息是,您还可以将它用于酷炫的 GUI 效果,例如遮蔽 GUI 部分繁忙且用户无法交互。您还可以在 GlassPane 中显示忙碌的 gif 图像。

链接:-

    Official tutorial on GlassPane Some helpful tutorials Another tut Oreilly's Swing Hacks 非常棒。

【讨论】:

【参考方案2】:

你一定是做错了什么。试试How to Use Progress Bars 上的教程。如果您能理解该代码的工作原理,它应该会为您提供实现所需功能的方向。

请注意,进度条通常是模态的。

【讨论】:

教程中的代码不会产生模态进度条/对话框。当进程在 SwingWorker 中运行时,我仍然可以操作 GUI。 @Zarkonnen 我想你指的是 ProgressMonitor 演示。改为在模式对话框中尝试 JProgressBar。 已经这样做了。但是,如果您运行演示,您仍然可以在显示进度监视器时操作主窗口。如果我更换进度监视器,它会停止工作,因为 EDT 再次卡住等待 setVisible 返回。

以上是关于非阻塞模式 Swing 进度对话框的主要内容,如果未能解决你的问题,请参考以下文章

如何制作 setVisible 阻塞的非模态对话框?

关于阻塞/非阻塞同步/非同步死锁

PHP Streams 中的阻塞和非阻塞模式

以非阻塞方式打开 QDialog

Windows Sockets 非阻塞模式

Android新手入门2016(11)--非阻塞对话框AlertDialog