一个愚蠢的问题,但我真的无法让它工作:我在Swing应用程序中有一些长时间运行的过程可能需要几分钟。我希望在此过程正在进行时向用户显示进度对话框。我还想阻止用户执行进一步的操作,例如在进行过程中按下按钮。
如果我在EDT上执行此过程,这显然会阻止最终用户在进程中执行任何操作。但是因为EDT正忙于处理,所以它永远无法渲染对话框的内容,所以我只是得到了对话框的轮廓。
但是如果我在工作线程中执行该过程,最终用户可以单击按钮并使EDT操纵工作者同时操作的状态,其中坏东西结果。如果我进行对话模式,那不会发生,但是Swing中的模态也意味着阻塞,所以当我调用setVisible(true)
时,线程永远阻塞。
所以我当前的“解决方案”是使用工作线程,然后产生一个单独的线程,其唯一目的是吸收setVisible
的阻塞性质。当然必须有更好的解决方案!
那么我如何得到一个对话框,阻止用户与系统的其余部分(模态)交互,但是不阻止导致它可见的线程?
答案 0 :(得分:15)
您应该使用GlassPane阻止用户进行交互。好处是这对用户来说是模态的,而不是你的程序,所以你的线程不会被阻止。
好消息是,您还可以将其用于很酷的GUI效果,例如将GUI部分着色为阴影,用户无法与之交互。您还可以在GlassPane中显示忙碌的GIF图像。
链接: -
答案 1 :(得分:0)
你一定做错了。试试How to Use Progress Bars上的教程。如果您能理解该代码的工作原理,那么它应该为您提供实现所需功能的方向。
请注意,进度条通常是模态的。