Как программно закрыть JFrame - PullRequest
233 голосов
/ 05 августа 2009

Как правильно получить закрытие JFrame, так же, как если бы пользователь нажал кнопку закрытия X или нажал Alt + F4 (вкл Windows)

Моя операция закрытия по умолчанию настроена так, как я хочу, через:

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Он делает именно то, что я хочу с вышеупомянутыми элементами управления. Этот вопрос не об этом.

Что я действительно хочу сделать, так это заставить графический интерфейс вести себя так же, как нажатие кнопки закрытия X приведет к его поведению.

Предположим, я должен был расширить WindowAdaptor, а затем добавить экземпляр моего адаптера в качестве прослушивателя через addWindowListener(). Я хотел бы видеть ту же последовательность вызовов через windowDeactivated(), windowClosing() и windowClosed(), как это происходит с кнопкой закрытия X. Не столько разорвать окно, сколько сказать так, чтобы оно разорвалось, так сказать.

Ответы [ 18 ]

3 голосов
/ 03 июня 2014

Исходя из ответов, уже предоставленных здесь, я так и реализовал:

JFrame frame= new JFrame()
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// frame stuffs here ...

frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));

JFrame закрывает событие, а после закрытия выходит из него.

3 голосов
/ 17 октября 2012

В этом примере показано, как реализовать подтвержденную операцию закрытия окна.

В окне есть оконный адаптер, который переключает операцию закрытия по умолчанию на EXIT_ON_CLOSE или DO_NOTHING_ON_CLOSE в зависимости от вашего ответа в OptionDialog.

Метод closeWindow ConfirmedCloseWindow запускает событие закрытия окна и может использоваться где угодно, т. Е. Как действие пункта меню

public class WindowConfirmedCloseAdapter extends WindowAdapter {

    public void windowClosing(WindowEvent e) {

        Object options[] = {"Yes", "No"};

        int close = JOptionPane.showOptionDialog(e.getComponent(),
                "Really want to close this application?\n", "Attention",
                JOptionPane.YES_NO_OPTION,
                JOptionPane.INFORMATION_MESSAGE,
                null,
                options,
                null);

        if(close == JOptionPane.YES_OPTION) {
           ((JFrame)e.getSource()).setDefaultCloseOperation(
                   JFrame.EXIT_ON_CLOSE);
        } else {
           ((JFrame)e.getSource()).setDefaultCloseOperation(
                   JFrame.DO_NOTHING_ON_CLOSE);
        }
    }
}

public class ConfirmedCloseWindow extends JFrame {

    public ConfirmedCloseWindow() {

        addWindowListener(new WindowConfirmedCloseAdapter());
    }

    private void closeWindow() {
        processWindowEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));
    }
}
3 голосов
/ 13 ноября 2016

Этот ответ дал Алекс, и я хотел бы рекомендовать его. Это сработало для меня, и еще одно, это просто и так просто.

setVisible(false); //you can't see me!
dispose(); //Destroy the JFrame object
2 голосов
/ 27 декабря 2012

Вы должны вставить вызов в очередь сообщений AWT, чтобы все синхронизации происходили правильно, иначе он не будет отправлять правильную последовательность событий, особенно в многопоточной программе. Когда это будет сделано, вы можете обработать результирующую последовательность событий точно так же, как если бы пользователь щелкнул по кнопке [x] для оформленного JFrame с установленной ОС.

public void closeWindow()
{
    if(awtWindow_ != null) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                awtWindow_.dispatchEvent(new WindowEvent(awtWindow_, WindowEvent.WINDOW_CLOSING));
            }
        });
    }
}
2 голосов
/ 01 сентября 2016

Я пробовал это, напишите свой собственный код для formWindowClosing () событие.

 private void formWindowClosing(java.awt.event.WindowEvent evt) {                                   
    int selectedOption = JOptionPane.showConfirmDialog(null,
            "Do you want to exit?",
            "FrameToClose",
            JOptionPane.YES_NO_OPTION);
    if (selectedOption == JOptionPane.YES_OPTION) {
        setVisible(false);
        dispose();
    } else {
        setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
    }
}    

Это спрашивает пользователя, хочет ли он выйти из Фрейма или Приложения.

1 голос
/ 27 августа 2014

Публикация того, что было в теле вопроса, как CW-ответ.

Хотел поделиться результатами, в основном полученными по ссылке camickr. В основном мне нужно бросить WindowEvent.WINDOW_CLOSING в очередь событий приложения. Вот краткий обзор того, как выглядит решение

// closing down the window makes sense as a method, so here are
// the salient parts of what happens with the JFrame extending class ..

    public class FooWindow extends JFrame {
        public FooWindow() {
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setBounds(5, 5, 400, 300);  // yeah yeah, this is an example ;P
            setVisible(true);
        }
        public void pullThePlug() {
                WindowEvent wev = new WindowEvent(this, WindowEvent.WINDOW_CLOSING);
                Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(wev);
        }
    }

// Here's how that would be employed from elsewhere -

    // someplace the window gets created ..
    FooWindow fooey = new FooWindow();
    ...
    // and someplace else, you can close it thusly
    fooey.pullThePlug();
1 голос
/ 25 июля 2015

Если вы не хотите, чтобы приложение закрывалось при закрытии JFrame, использовать: setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE)

вместо: setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

Из документации:

DO_NOTHING_ON_CLOSE (defined in WindowConstants): ничего не делать; требуется, чтобы программа обрабатывала операцию в методе windowClosing зарегистрированного объекта WindowListener.

HIDE_ON_CLOSE (defined in WindowConstants): автоматически скрывать фрейм после вызова любых зарегистрированных объектов WindowListener.

DISPOSE_ON_CLOSE (defined in WindowConstants): автоматически скрывать и удалять кадр после вызова любых зарегистрированных объектов WindowListener.

EXIT_ON_CLOSE (defined in JFrame): закрыть приложение, используя метод выхода из системы. Используйте это только в приложениях.

все еще может быть полезным: Вы можете использовать setVisible(false) на своем JFrame, если хотите снова отобразить тот же кадр. В противном случае вызовите dispose(), чтобы удалить все ресурсы собственного экрана.

скопировано с Питера Ланга

https://stackoverflow.com/a/1944474/3782247

0 голосов
/ 05 августа 2009
 setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...