关闭Swing应用程序框架中的窗口

时间:2012-07-06 13:03:07

标签: java swing swingx swing-app-framework

我正在使用Swing Application Framework JSR(296)来实现基于Swing的Java应用程序。

与AboutBox类似,我遵循@Action的使用并在我的项目中添加了一些JDialog类。

问题是,当我关闭主框架时,我的应用程序仍在后台运行。 为了解决这个问题,我将以下代码添加到我的主应用程序类的configureWindow()中:

protected void configureWindow(java.awt.Window root) {

    root.addWindowListener(new WindowAdapter() {
        @Override
        public void windowClosing(WindowEvent e) {
        // write your code here
            Application.getInstance(MyApp.class).exit();
        }
    });
}

但是每当我关闭对话框(包括AboutBox)时进行此修改,它也会关闭主框架。

如何阻止整个应用程序退出并关闭对话框?

更新 我正在使用NetBeans IDE 7.01,它允许创建Swing Application Framework项目。 它生成一个项目框架,如下所示:

MyApp 
|--myapp 
|   |--MyApp.java
|   |--MyAppAboutBox.java
|   |--MyAppView.java
|
|--myapp.resources
    |--MyApp.properties
    |--MyAppAboutBox.properties
    |--MyAppView.properties

NetBeans IDE允许从 Window-> Properties菜单添加操作。

MyApp类扩展了org.jdesktop.application.SingleFrameApplication,这是我的主要类。

MyAppView extends FrameView这是我的主要观点。

javax.swing.JDialog包的实施类位于myapp.view包中。

2 个答案:

答案 0 :(得分:3)

WindowEvent类有一个方法调用getWindow(),它返回正在关闭的窗口。

windowClosing方法中,您可以检查:如果窗口是主应用程序窗口,请使用您当前拥有的代码。如果不是,请拨打Window.dispose()

修改:我没注意到您在应用程序中创建了自定义对话框。也许你忘了处理它们?您应该添加类似于自动生成的框中的代码:

@Action public void closeAboutBox() {
    dispose();
}

并在对话框关闭时调用此操作。如果这不是问题,那么线程转储可能会帮助您在关闭主窗口时找出正在运行的线程。

答案 1 :(得分:1)

我认为你实际需要的是setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);。看看 JavaDoc API ...