我有一个启动其他应用程序的应用程序,比如Dock。问题是如果我正在启动的应用程序(JFrame
)具有EXIT_ON_CLOSE
,它也将关闭我的主应用程序。
我无法控制我正在启动的应用程序。也就是说,我不能指望应用程序具有良好的行为并使用DISPOSE_ON_CLOSE
。< / p>
我该怎么做才能避免这种情况?我已经尝试过使用线程,但没有运气。我也尝试将主应用程序线程放在守护进程中,但也没有运气。
我尝试过自定义SecurityManager
覆盖checkExit
方法。问题是现在即使主应用程序也无法退出。此外,它不起作用,因为使用EXIT_ON_CLOSE
作为其默认关闭操作的应用程序将抛出异常而不执行(因为Swing检查安全管理器的退出 - System.checkExit()),失败发布:(。
答案 0 :(得分:3)
如果您只想关闭所看到的框架,则应该是DISPOSE_ON_CLOSE
编辑:
尝试拦截EXIT_ON_CLOSE事件。
frame.getGlassPane() or frame.getRootPane()
可能有用。
此外,如果您有权执行其他应用的方法,则可以再次致电setDefaultCloseOperation
将其设置为DISPOSE_ON_CLOSE
答案 1 :(得分:3)
这有点像黑客,但您总是可以使用SecurityManager
来管理其他框架。
这个简单的示例可以防止帧退出:
import java.awt.*;
import javax.swing.*;
public class PreventExitExample {
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
PreventExitExample o = new PreventExitExample();
JFrame f = new JFrame(o.getClass().getSimpleName());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocationByPlatform(true);
f.setSize(new Dimension(400,200));
f.setVisible(true);
System.setSecurityManager(new PreventExitSecurityManager());
}
};
SwingUtilities.invokeLater(r);
}
}
class PreventExitSecurityManager extends SecurityManager {
@Override
public void checkExit(int status) {
throw new SecurityException("Cannot exit this frame!");
}
}
答案 2 :(得分:2)
您可以使用获取所有帧的列表 Frame的静态方法 public static Frame [] getFrames()
迭代列表并检查列表成员是否是JFrame的实例,将默认关闭操作更改为DISPOSE_ON_CLOSE