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

3
我有一个启动其他应用程序的应用程序,类似于一个 dock。问题是,如果我启动的应用程序(JFrame)具有EXIT_ON_CLOSE,它也会关闭我的主应用程序。 我无法控制我所启动的应用程序。也就是说,我不能期望应用程序表现良好并使用DISPOSE_ON_CLOSE
我该怎么办才能避免这种情况?我已经尝试使用线程,但没有成功。我还尝试将主应用程序线程设置为守护进程,但也没有成功。
我尝试放置自定义SecurityManager覆盖checkExit方法。问题是,现在甚至主应用程序也无法退出。而且,这种方法不起作用,因为使用EXIT_ON_CLOSE作为默认关闭操作的应用程序会抛出异常并且不执行(因为 Swing 检查安全管理器以进行退出--System.checkExit()),从而无法启动 :(。

你是通过像frame.setVisible这样的方式启动另一个应用程序,还是通过Runtime或Process Builder创建一个新进程? - Zach L
我正在特定的类加载器中通过反射启动。 - Marcos Roriz Junior
3个回答

3
如果你想关闭当前的窗口,应该使用DISPOSE_ON_CLOSE
编辑:
尝试拦截EXIT_ON_CLOSE事件。
frame.getGlassPane() or frame.getRootPane()

今日免费次数已满, 请开通会员/明日再来

但是我无法控制我将要运行的应用程序。这就是问题所在。 - Marcos Roriz Junior

3

这是一个有点hack的方法,但您可以始终使用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!");
    }
}

1
是的,我认为例如开源项目JDistro做了类似的事情。 - Anthony
嗨,使用自定义SecurityManager的问题是现在即使是主应用程序也无法退出。而且,它不起作用,因为将EXIT_ON_CLOSE作为默认关闭操作的应用程序会抛出异常并且不能执行(因为Swing检查退出的Security Manager-- System.checkExit())。 - Marcos Roriz Junior
如果你运行了那段代码,你可能会看到主应用程序可以退出。 - Andrew Thompson
好的,主应用程序可以退出。但是其他应用程序无法运行(即那些具有EXIT_ON_CLOSE的应用程序)。 - Marcos Roriz Junior
@StefanDollase 已删除链接,包含一个示例。 - Andrew Thompson

2

您可以使用Frame的静态方法public static Frame[] getFrames()获取所有帧的列表。

遍历该列表,并检查列表成员是否为JFrame类型,将默认关闭操作更改为DISPOSE_ON_CLOSE。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接