1

我正在为基于 Swing 的 Java 应用程序使用 Swing 应用程序框架 JSR(296)。

与 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)时,通过此修改,它也会关闭主框架。

我应该怎么做才能防止整个应用程序退出并关闭对话框?

更新: 我正在使用允许创建 Swing 应用程序框架项目的 NetBeans IDE 7.01。它会生成一个项目骨架,如下所示:

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.JDialogmyapp.view包中。

4

2 回答 2

3

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

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

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

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

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

于 2012-07-06T13:33:35.400 回答
1

我认为您真正要寻找的是setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);. 看看JavaDoc API ...

于 2012-07-06T14:39:06.743 回答