4

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

总体思路是这样的:

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

我知道 Swing 在后台使用了一些线程,我理解这就是为什么程序在关闭 GUI 之前不会阻塞的原因。

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

4

4 回答 4

6

等待 Swing GUI 关闭后再继续

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

于 2012-06-04T05:22:01.553 回答
2

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

  • 用户操作添加WindowListener

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

于 2012-06-04T05:39:47.577 回答
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
于 2019-04-12T12:05:19.833 回答
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);
于 2021-01-29T12:08:23.160 回答