Java程序没有退出关闭按钮

时间:2011-12-14 16:20:53

标签: java dialog jvm dispose

我在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);

    }

}

1 个答案:

答案 0 :(得分:3)

添加以下内容:

mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

请参阅JFrame文档:

  

与Frame不同,JFrame有一些关于如何响应的概念   用户尝试关闭窗口。默认行为是简单的   用户关闭窗口时隐藏JFrame。要更改默认值   行为,您调用方法setDefaultCloseOperation(int)。要做   使用时,JFrame的行为与Frame实例相同   setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE)。

然后查看JFrame.setDefaultCloseOperation