Как избежать операции JFrame EXIT_ON_CLOSE для выхода из всего приложения? - PullRequest
4 голосов
/ 28 января 2011

У меня есть приложение, которое запускает другие приложения, что-то вроде дока. Проблема в том, что если приложение, которое я запускаю (JFrame), имеет EXIT_ON_CLOSE, оно также закроет мое основное приложение.

Я не имею никакого контроля над приложениями, которые я запускаю. То есть я не могу ожидать, что приложение будет иметь хорошее поведение и использовать DISPOSE_ON_CLOSE.

Что я могу сделать, чтобы избежать этого? Я уже пытался использовать темы, но не повезло. Я также пытался поместить основной поток приложения в демон, но тоже не повезло.

Я пытался поставить пользовательский SecurityManager, перезаписывающий checkExit метод. Проблема в том, что теперь даже основное приложение не может выйти. Кроме того, он не «работает», потому что приложения, использующие EXIT_ON_CLOSE в качестве закрывающей операции по умолчанию, будут генерировать исключение и не будут выполняться (поскольку Swing проверяет диспетчер безопасности на выход - System.checkExit ()), не в состоянии запускаться :. (

Ответы [ 3 ]

3 голосов
/ 28 января 2011

Это что-то вроде хака, но вы всегда можете использовать 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!");
    }
}
3 голосов
/ 28 января 2011

если вы хотите закрыть только кадр, который вы видите, оно должно быть DISPOSE_ON_CLOSE

РЕДАКТИРОВАТЬ:

Попробуйте перехватить событие EXIT_ON_CLOSE.

frame.getGlassPane() or frame.getRootPane()

можетбыть полезным.

Также, если у вас есть право выполнять методы другого приложения, вы можете снова вызвать setDefaultCloseOperation, установив для него DISPOSE_ON_CLOSE

2 голосов
/ 28 января 2011

Вы можете получить список всех фреймов, используя статический метод Frame. Public static Frame [] getFrames ()

Выполнить итерацию списка и проверить, является ли член списка экземпляром JFrame, изменить операцию закрытия по умолчанию на DISPOSE_ON_CLOSE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...