【发布时间】:2013-03-20 03:40:45
【问题描述】:
mainFrame().addWindowListener(new java.awt.event.WindowAdapter() {
@Override
public void windowClosing(java.awt.event.WindowEvent evt)
{
retrieveItems();
closeAllConnections();
System.exit(0);
}
});
对于上面的代码,retrieveItems() 执行得很好,但是在 closeAllConnections() 内部有一个名为 doBackup() 的后台任务根本不执行。该程序似乎只是跳过了任务。以下是closeAllConnections() 包含的内容的简要视图;
public void closeAllConnections()
{
boolean shouldBackup = getBackupOnCloseStatus();
if(shouldBackup)
{
doBackUp();
}
dbManager.disconnectDB();
}
使用Netbeans Step-Debugger 后,我注意到程序执行甚至没有进入doBackup() 方法,就在应用程序退出之前。这很奇怪。对于可能导致这种行为的任何帮助,我将不胜感激。谢谢好心人!
如果这条额外的信息可能有助于找到解决方案,我正在使用 Swing 应用程序框架,所以任务 doBackup() 看起来像以下...
@Action
public Task doBackUp()
{
return new DoBackUpTask(getApplication());
}
private class DoBackUpTask extends org.jdesktop.application.Task<Object, Void>
{
private boolean done = false;
DoBackUpTask(org.jdesktop.application.Application app)
{
super(app);
this.setMessage("Backing-up database...");
}
@Override
protected Object doInBackground()
{
File destDir = new File(appManager.getBackUpDir());
done = backUpDataBase(destDir);
return null;
}
@Override
protected void succeeded(Object result)
{
if(done)
{
setMessage("BackUp completed.");
}
}
}
【问题讨论】:
-
你是否在任何地方设置了JFrame的默认关闭操作?
-
我会说是因为你在
DoBackUpTask可以执行之前调用了System.exit(0)(假设它是一个非守护线程) -
@HovercraftFullOfEels 我没有明确设置默认关闭操作...但我怀疑 Netbeans GUI-Builder 可能在应用程序的 mainFrame ('FrameView' in SAF 的情况)使用“X”按钮关闭。
-
@MadProgrammer,我认为您可能是对的,但我无法找到 netbeans GUI-Builder 在主 FrameView 上设置关闭操作的位置。它在 JDialogs 上比在这些 SAF FrameViews 上更容易找到
-
@Teejay 也许你可以改用shut down hook
标签: java awt windowlistener background-thread swing-app-framework