2

我想在执行线程时显示进度条并阻止与我的应用程序框架的交互。

在另一个线程中,有人建议使用 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); 
4

3 回答 3

3

最简单的方法是使用 JXLayer 和 LockableUI。在此处查看如何执行此操作的示例。

另请注意,JXLayer 已进入 Java 7,并以javax.swing.JLayer的形式提供。

另一件事是,您不应该在事件调度线程中执行长时间运行的任务。阅读有关SwingWorker学习为 Swing 编写多线程代码

于 2012-06-01T14:07:47.460 回答
3

这就是模态对话框的要点,在“框”之外不会发生任何交互。模式弹出窗口还会在等待用户输入时暂停线程。如果你想在显示对话框时做其他事情,你要么必须在对话框本身中做,要么启动一个新线程来处理它。

希望有帮助!

于 2012-06-01T14:07:54.467 回答
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,它将拦截来自用户的任何事件。

于 2012-06-01T20:58:24.503 回答