如何避免JFrame EXIT_ON_CLOSE操作退出整个应用程序?

时间:2011-01-28 11:52:02

标签: java multithreading swing jframe

我有一个启动其他应用程序的应用程序,比如Dock。问题是如果我正在启动的应用程序(JFrame)具有EXIT_ON_CLOSE,它也将关闭我的主应用程序。

我无法控制我正在启动的应用程序。也就是说,我不能指望应用程序具有良好的行为并使用DISPOSE_ON_CLOSE。< / p>

我该怎么做才能避免这种情况?我已经尝试过使用线程,但没有运气。我也尝试将主应用程序线程放在守护进程中,但也没有运气。

我尝试过自定义SecurityManager覆盖checkExit方法。问题是现在即使主应用程序也无法退出。此外,它不起作用,因为使用EXIT_ON_CLOSE作为其默认关闭操作的应用程序将抛出异​​常而不执行(因为Swing检查安全管理器的退出 - System.checkExit()),失败发布:(。

3 个答案:

答案 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