在关闭主 Swing window 时,不会创建 EventQueue 上的另一个线程
On closing the main Swing window, the other thread on the EventQueue gets not created
我编写 Java SE 8 桌面应用程序。它有一个 Swing UI.
平台:
- 日食IDE
- Windows 10 OS
现在,当我关闭主 window 时,通过按右上角的 "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();
}
}
}
});
}
所以,我使用侦听器来识别 window 关闭事件,当发生这种情况时,我询问用户是否保存项目(它是数据库上的数据)。
此方法 (saveUnsavedTmpProject(continueOn);
) 导致另一个 window 应该采用保存项目的名称。
现在 CountDownLatch
强制主 window 保持运行,直到用户 confirms/rejects 在另一个面板上保存项目。
另一种创建 window 并保存项目的 class 方法就在这里:
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();
}
}
});
}
}
}
}
现在,当我 运行 应用程序时,我没有进入 运行() 方法(也没有 window弹出)。 但是只有当我只从上面提到的侦听器访问这个方法时才会发生这种情况。它有 CountDownLatch
,它似乎停止了新线程的执行。
当用户 confirms/denies 保存项目时,闩锁 倒计时 ,以便执行流程继续。
然而,我在 EventQueue
.
上创建了附加线程
为什么线程停止了?
facebook.com
上的 Java 组 为我指明了正确的方向。
解决方案是这样的:
- 重新定义关闭按钮 (X) 在主 GUI 上的作用。
它来了:
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
现在当我单击主 GUI window 的关闭按钮时,关闭不会导致关闭 window。这意味着我不再需要 CountDownLatch
class,它正在阻止主要 window 关闭(并等待用户 counts-down 在另一个 class).
最后,我让应用程序以我喜欢的方式工作。
我编写 Java SE 8 桌面应用程序。它有一个 Swing UI.
平台:
- 日食IDE
- Windows 10 OS
现在,当我关闭主 window 时,通过按右上角的 "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();
}
}
}
});
}
所以,我使用侦听器来识别 window 关闭事件,当发生这种情况时,我询问用户是否保存项目(它是数据库上的数据)。
此方法 (saveUnsavedTmpProject(continueOn);
) 导致另一个 window 应该采用保存项目的名称。
现在 CountDownLatch
强制主 window 保持运行,直到用户 confirms/rejects 在另一个面板上保存项目。
另一种创建 window 并保存项目的 class 方法就在这里:
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();
}
}
});
}
}
}
}
现在,当我 运行 应用程序时,我没有进入 运行() 方法(也没有 window弹出)。 但是只有当我只从上面提到的侦听器访问这个方法时才会发生这种情况。它有 CountDownLatch
,它似乎停止了新线程的执行。
当用户 confirms/denies 保存项目时,闩锁 倒计时 ,以便执行流程继续。
然而,我在 EventQueue
.
为什么线程停止了?
facebook.com
上的 Java 组 为我指明了正确的方向。
解决方案是这样的:
- 重新定义关闭按钮 (X) 在主 GUI 上的作用。
它来了:
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
现在当我单击主 GUI window 的关闭按钮时,关闭不会导致关闭 window。这意味着我不再需要 CountDownLatch
class,它正在阻止主要 window 关闭(并等待用户 counts-down 在另一个 class).
最后,我让应用程序以我喜欢的方式工作。