我在NetBeans中有一个非常标准的Java桌面应用程序。我最近添加了一个jDialog模式作为欢迎横幅,并开始关闭应用程序的问题。如果我使用主框架上的默认菜单(文件>退出),它似乎总是正确关闭。如果我点击主窗口上的关闭按钮,框架将消失,但JVM仍将运行。
删除调用以显示对话框完全解决了问题,所以我猜这就是问题所在。我非常确定对话框是否正确处理,因为这是我第一次猜测JVM不会退出的原因。
要检查我的理智,而不是调用我的欢迎对话框,我开始调用创建应用程序时由NetBeans自动生成的默认showAboutBox()
。同样的问题。通过菜单调用时对话框工作正常(我不确定是否因为它是一个Action),但如果直接调用则会导致JVM无法正确退出。
两个对话框都将setDefaultCloseOperation()
设置为DISPOSE_ON_CLOSE
。
下面是调用aboutBox的代码片段(与我的欢迎对话框相同):
@Action
public void showAboutBox() {
if (aboutBox == null) {
JFrame mainFrame = MyApp.getApplication().getMainFrame();
aboutBox = new MyAboutBox(mainFrame);
aboutBox.setLocationRelativeTo(mainFrame);
}
MyApp.getApplication().show(aboutBox);
}
无论如何,我自己解决了这个问题。
所以我猜你不能在构造函数中调用对话框......
修复......
/*
* MyApp.java
*/
import org.jdesktop.application.Application;
import org.jdesktop.application.SingleFrameApplication;
/**
* The main class of the application.
*/
public class MyApp extends SingleFrameApplication {
/**
* At startup create and show the main frame of the application.
*/
@Override protected void startup() {
show(new MyView(this));
MyView.doThisCodeAfterTheMainFrameIsLoaded();
}
/**
* A convenient static getter for the application instance.
* @return the instance of MyApp
*/
public static MyApp getApplication() {
return Application.getInstance(MyApp.class);
}
/**
* Main method launching the application.
*/
public static void main(String[] args) {
launch(MyApp.class, args);
}
}
/*
* MyView.java
*/
/**
* The application's main frame.
*/
public class MyView extends FrameView {
public MyView(SingleFrameApplication app) {
super(app);
initComponents();
// Don't call a dialog here!
// showAboutBox();
}
public static void doThisCodeAfterTheMainFrameIsLoaded() {
JFrame mainFrame = MyApp.getApplication().getMainFrame();
JDialog welcome = new MyWelcome(mainFrame);
welcome.setLocationRelativeTo(mainFrame);
MyApp.getApplication().show(welcome);
}
}
答案 0 :(得分:3)
添加以下内容:
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
请参阅JFrame文档:
与Frame不同,JFrame有一些关于如何响应的概念 用户尝试关闭窗口。默认行为是简单的 用户关闭窗口时隐藏JFrame。要更改默认值 行为,您调用方法setDefaultCloseOperation(int)。要做 使用时,JFrame的行为与Frame实例相同 setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE)。