Закрытие окна в 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...