我想在执行线程时显示进度条并阻止与应用程序框架的交互。
在另一个帖子中有人建议使用JDialog而不是JFrame和setModal(true)
。但是,这样做时,Dialog会阻止整个应用程序。
这基本上是我的代码:
MyDialog dlg = new MyDialog();
dlg.setModal(true);
dlg.setVisible(true);
//do some stuff....
//(never executed when setModal(true)
dlg.setVisible(false);
答案 0 :(得分:3)
最简单的方法是使用JXLayer和LockableUI。 请查看here以获取如何完成此操作的示例。
另请注意,JXLayer已将其转换为Java 7,并以javax.swing.JLayer形式提供。
另一件事是,您不应该执行长时间运行的任务以及事件调度线程。阅读SwingWorker和learn to write multithreaded code for Swing。
答案 1 :(得分:3)
这是模态对话框的重点,在"框"之外不会发生任何交互。模态弹出窗口也在等待用户输入时停止线程。如果你想在显示对话框时做其他的事情,你要么必须在对话框中进行,要么开始一个新线程来处理它。
希望有所帮助!
答案 2 :(得分:1)
使用模态对话框尝试这样的事情:
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,它将拦截来自用户的任何事件。