Закрытие окна в Swing Application Framework

Я использую Swing Application Framework JSR(296) для моего Java-приложения на основе Swing.

Подобно 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), он также закрывает основной фрейм.

Что я должен сделать, чтобы предотвратить выход всего приложения и просто закрыть диалоговое окно?

Обновление: я использую среду IDE NetBeans 7.01, которая позволяет создавать проект Swing Application Framework. Он генерирует скелет проекта, как показано ниже:

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

IDE NetBeans позволяет добавлять действия из меню "Окно" -> "Свойства".

Класс MyApp расширяет org.jdesktop.application.SingleFrameApplication, который является моим основным классом.

MyAppView extends FrameView что является моим основным видом

Реализация классов javax.swing.JDialog находятся в myapp.view пакет.

2 ответа

Решение

Класс WindowEvent имеет вызов метода getWindow (), который возвращает закрывающееся окно.

Внутри вашего windowClosing Метод, который вы можете проверить: если окно является основным окном приложения, используйте код, который у вас есть. Если это не так, просто вызовите Window.dispose()

Изменить: я не заметил, что вы создавали пользовательские диалоги в вашем приложении. Может быть, вы забыли избавиться от них? Вы должны добавить код, подобный тому, который был автоматически добавлен в поле about:

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

и вызывайте это действие всякий раз, когда диалог закрывается. Если это не проблема, дамп потока, вероятно, поможет вам выяснить, какой поток запущен, когда вы закрываете главное окно.

Я думаю, что вы на самом деле ищете setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);, Посмотрите на API JavaDoc...

Другие вопросы по тегам