Swing:如何禁止JFrame / JDialog之外的交互?

时间:2012-06-01 14:04:09

标签: java swing jframe jdialog

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

在另一个帖子中有人建议使用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); 

3 个答案:

答案 0 :(得分:3)

最简单的方法是使用JXLayer和LockableUI。 请查看here以获取如何完成此操作的示例。

另请注意,JXLayer已将其转换为Java 7,并以javax.swing.JLayer形式提供。

另一件事是,您不应该执行长时间运行的任务以及事件调度线程。阅读SwingWorkerlearn 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,它将拦截来自用户的任何事件。