在继续之前等待Swing GUI关闭

时间:2012-06-04 05:21:19

标签: java multithreading swing command-line

我正在编写一个应用程序,要求用户将一些数据输入到应用程序随后将使用的Swing GUI中。用户输入数据后,不再需要GUI,因为应用程序会将一些数据写入文件。

一般的想法是:

launchGui();
closeGui();
continueWithComputation();

据我所知,Swing在后台使用了一些线程,我理解为什么程序在GUI关闭之前不会阻塞。

在继续JFrame之前,是否有可能以任何方式等待GUI关闭(dispose()关闭continueWithComputation())?

4 个答案:

答案 0 :(得分:6)

  

等待Swing GUI关闭然后继续

使用模态对话框。有关详细信息,请参阅以下内容:

答案 1 :(得分:2)

  

在继续使用continueWithComputation()之前,是否有可能以任何方式等待GUI关闭(使用dispose()关闭单个JFrame?

  • 用户操作添加WindowListener

  • 从代码调用JFrame#setVisible(false),然后你可以运行continueWithComputation(),你必须通过System.exit(0)关闭这个JVM,否则停留在PC的RAM中,直到重新启动或关闭电源

答案 2 :(得分:0)

我只是遇到了类似的问题,但是没有closeGui()方法,并使用WindowListener和一些Java同步提出了这个相对较短的代码段:

AtomicBoolean closed = new AtomicBoolean(false);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

frame.addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosed(WindowEvent e) {
        synchronized(closed) {
            closed.set(true);
            closed.notify();
        }
        super.windowClosed(e);
    }
} );

frame.setVisible(true);
synchronized(closed) {
    while (!closed.get()) {
        closed.wait();
    }
}

// executes after the Frame has been disposed

答案 3 :(得分:0)

我的建议是将 JFrame GUI 作为 Modal 打开,然后一切都会等到它从屏幕上消失。由于 JFrame 不能设置为模态,因此您必须将 GUI 框架作为 JDialog 打开。我正在使用:

public class frameMain extends JDialog{ 

确保在您使用的构造函数中:

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

无论您需要在何处启动 GUI 框架,都应该使用:

frameMain frm= new frameMain ();
frm.setModal(true);
frm.setVisible(true);