非阻塞模态Swing进度对话框

Zar*_*nen 16 swing modal-dialog nonblocking progressdialog

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

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

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

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

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

App*_*rew 15

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

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

链接:-

  1. GlassPane官方教程
  2. 一些有用的教程
  3. 另一个啧啧
  4. Oreilly的Swing Hacks非常出色.