我正在使用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
包中。
答案 0 :(得分:3)
WindowEvent类有一个方法调用getWindow(),它返回正在关闭的窗口。
在windowClosing
方法中,您可以检查:如果窗口是主应用程序窗口,请使用您当前拥有的代码。如果不是,请拨打Window.dispose()
修改:我没注意到您在应用程序中创建了自定义对话框。也许你忘了处理它们?您应该添加类似于自动生成的框中的代码:
@Action public void closeAboutBox() {
dispose();
}
并在对话框关闭时调用此操作。如果这不是问题,那么线程转储可能会帮助您在关闭主窗口时找出正在运行的线程。
答案 1 :(得分:1)
我认为你实际需要的是setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
。看看 JavaDoc API ...