我正在编写一个应用程序,要求用户将一些数据输入到应用程序随后将使用的Swing GUI中。用户输入数据后,不再需要GUI,因为应用程序会将一些数据写入文件。
一般的想法是:
launchGui();
closeGui();
continueWithComputation();
据我所知,Swing在后台使用了一些线程,我理解为什么程序在GUI关闭之前不会阻塞。
在继续JFrame
之前,是否有可能以任何方式等待GUI关闭(dispose()
关闭continueWithComputation()
)?
答案 0 :(得分:6)
答案 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);