[英]On closing the main Swing window, the other thread on the EventQueue gets not created
我编写Java SE 8桌面应用程序。 它有一个Swing UI。
平台:
现在,当我关闭主窗口时,通过按下右上角的“ X”,我有一个侦听器来监听此类事件。
听众就在这里:
private void listenerForClosingResources(){
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
if(e.getID() == WindowEvent.WINDOW_CLOSING){
CountDownLatch continueOn = new CountDownLatch(1);
saveUnsavedTmpProject(continueOn);
try {
continueOn.await();
}
catch(InterruptedException ee) {
ee.printStackTrace();
}
}
}
});
}
因此,我使用侦听器来确定窗口关闭事件,并在发生这种情况时询问用户是否保存项目(数据库中的数据)。
此方法( saveUnsavedTmpProject(continueOn);
)导致另一个窗口,该窗口应该采用保存项目的名称。
现在, CountDownLatch
强制主窗口保持打开状态,直到用户确认/拒绝将项目保存在另一个面板上为止。
另一个创建窗口的类方法可以保存项目,就在这里:
public static void getInstance(CountDownLatch continueOn, String openProjectName) {
if(frame == null) {
synchronized(SaveAsPane.class) {
if(frame == null) {
carryOn = continueOn;
if(!openProjectName.isEmpty()){
openProject = openProjectName;
}
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
frame = new SaveAsPane();
frame.setVisible(true);
frame.setLocationRelativeTo(MainGUI.getMainGUI());
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
}
}
现在,当我运行该应用程序时,我没有进入run()方法内部(并且没有弹出窗口)。 但这仅在我仅从上述侦听器访问此方法时发生。 它具有CountDownLatch
,并且似乎停止了新线程的执行。
当用户确认/拒绝保存项目时,锁存器将递减计数 ,以便执行流程继续进行。 但是,我在EventQueue
上创建了其他线程。
线程为何停止?
facebook.com
上的Java小组向我指出了正确的方向。 解决方法是这样的:
它来了:
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
现在,当我单击GUI主窗口的关闭按钮时,关闭不会导致关闭该窗口。 这意味着我不再需要CountDownLatch
类,该类可以停止关闭主窗口(并等待用户在另一个类上递减计数 )。
最后,我以自己喜欢的方式使应用程序正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.