2010-10-07 106 views
16

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

如果我这样做对EDT的过程中,这显然可以防止在过程是怎么回事任何事情的最终用户。但是由于美国东部时间正在忙于处理,所以它从不会显示对话框的内容,因此我只是获取对话框的轮廓。

但是,如果我在工作线程中执行该过程,则最终用户可以单击按钮并导致EDT操纵工作人员同时操作的状态,因此坏东西。如果我做的对话框模式,这不会发生,但在Swing 模式也意味着阻挡,所以此刻我叫setVisible(true),线程块,直到永远。

所以我现在的“解决方案”是使用工作者线程,然后产生一个单独的线程,其唯一目的是吸收setVisible的阻塞性质。当然,必须有更好的解决方案!

那么,如何获取阻止用​​户与系统(模式)的其余部分交互但不阻塞,导致它是可见的线程的对话?

+0

参见:http://stackoverflow.com/questions/3954120/swing-modal-dialog-refuses-to-close-sometimes – Zarkonnen 2012-10-20 07:39:16

回答

0

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

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

+0

本教程中的代码不会产生模式的进度条/对话框。当进程在SwingWorker中运行时,我仍然可以操作GUI。 – Zarkonnen 2010-10-10 18:05:12

+0

@Zarkonnen我认为你参考了ProgressMonitor演示。改为在模态对话框中尝试使用JProgressBar。 – 2010-10-11 01:35:15

+0

已经这样做了。但是如果你运行演示,你仍然可以在显示进度监视器的同时操作主窗口。如果我替换进度监视器,它将停止工作,因为EDT再次卡住等待setVisible返回。 – Zarkonnen 2010-10-14 20:21:34