一个愚蠢的问题,但我真的无法让它工作:我在 Swing 应用程序中有一些长时间运行的进程,可能需要几分钟。我想在此过程进行时向用户显示进度对话框。我还想阻止用户执行进一步的操作,例如在进程进行时按下按钮。
如果我在 EDT 上执行该过程,这显然会阻止最终用户在该过程进行时做任何事情。但是因为 EDT 正忙于处理,它永远不会渲染对话框的内容,所以我只得到对话框的轮廓。
但是,如果我在工作线程中执行该过程,最终用户可以单击按钮并导致 EDT 操纵工作人员同时也在操纵的状态,结果是坏东西。如果我将对话框设为模态,那不会发生,但Swing 中的模态也意味着阻塞,所以在我调用的那一刻setVisible(true)
,线程永远阻塞。
所以我目前的“解决方案”是使用一个工作线程,然后产生一个单独的线程,其唯一目的是吸收setVisible
. 当然必须有更好的解决方案!
那么如何获得一个对话框来阻止用户与系统的其余部分(模式)交互但不阻止导致它可见的线程?