我想在执行线程时显示进度条并阻止与我的应用程序框架的交互。
在另一个线程中,有人建议使用 JDialog 而不是 JFrame 和
setModal(true)
。但是,这样做时对话框会阻止整个应用程序。
这本质上是我的代码:
MyDialog dlg = new MyDialog();
dlg.setModal(true);
dlg.setVisible(true);
//do some stuff....
//(never executed when setModal(true)
dlg.setVisible(false);
这就是模式对话框的要点,“框”之外不会发生任何交互。模式弹出窗口还会在等待用户输入时暂停线程。如果您想在显示对话框时执行其他操作,则必须在对话框本身中执行此操作,或者启动一个新线程来处理它。
希望有帮助!
最简单的方法是使用 JXLayer 和 LockableUI。 请参阅此处了解如何完成此操作的示例。
另请注意,JXLayer 已进入 Java 7,并且可用作 javax.swing.JLayer。
另一件事是,您不应该在事件调度线程中执行长时间运行的任务。了解 SwingWorker 并学习为 Swing 编写多线程代码。
final JDialog dlg = new JDialog();
dlg.setModal(true);
dlg.setSize(500, 500);
dlg.addWindowListener(new WindowAdapter() {
@Override
public void windowActivated(WindowEvent e) { //or other method
new Thread(new Runnable() {
public void run() {
try {
//execute your long running task
} //you should catch exception
finally {
dlg.setVisible(false);
dlg.dispose();
}
}
}).start();
}
});
dlg.setVisible(true);
我还可以在 JFrame 上设置 GlassPane,它将拦截来自用户的任何事件。