非阻塞模态Swing进度对话框

时间:2010-10-07 22:16:49

标签: swing modal-dialog nonblocking progressdialog

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

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

但是如果我在工作线程中执行该过程,最终用户可以单击按钮并使EDT操纵工作者同时操作的状态,其中坏东西结果。如果我进行对话模式,那不会发生,但是Swing中的模态也意味着阻塞,所以当我调用setVisible(true)时,线程永远阻塞。

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

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

2 个答案:

答案 0 :(得分:15)

您应该使用GlassPane阻止用户进行交互。好处是这对用户来说是模态的,而不是你的程序,所以你的线程不会被阻止。

好消息是,您还可以将其用于很酷的GUI效果,例如将GUI部分着色为阴影,用户无法与之交互。您还可以在GlassPane中显示忙碌的GIF图像。

链接: -

  1. Official tutorial on GlassPane
  2. Some helpful tutorials
  3. Another tut
  4. Oreilly's Swing Hacks非常棒。

答案 1 :(得分:0)

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

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