Как записать событие нажатия кнопки закрытия JFrame? - PullRequest
81 голосов
/ 01 февраля 2012

Я хочу вызвать метод confirmExit(), когда нажата красная кнопка закрытия строки заголовка JFrame.

Как мне записать это событие?

Я также хотел бы предотвратить закрытие окна, если пользователь решит не продолжать.

Ответы [ 6 ]

129 голосов
/ 01 февраля 2012
import javax.swing.JOptionPane;
import javax.swing.JFrame;

/*Some piece of code*/
frame.addWindowListener(new java.awt.event.WindowAdapter() {
    @Override
    public void windowClosing(java.awt.event.WindowEvent windowEvent) {
        if (JOptionPane.showConfirmDialog(frame, 
            "Are you sure you want to close this window?", "Close Window?", 
            JOptionPane.YES_NO_OPTION,
            JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION){
            System.exit(0);
        }
    }
});

Если вы также хотите запретить закрытие окна, если пользователь не выберет «Да», вы можете добавить:

frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
25 голосов
/ 01 февраля 2012

Переопределить метод закрытия окна.

public void windowClosing(WindowEvent e)

Он вызывается, когда окно находится в процессе закрытия. На этом этапе операция закрытия может быть отменена.

4 голосов
/ 01 февраля 2012
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

тоже работает. Сначала создайте JFrame с именем frame, затем добавьте этот код внизу.

1 голос
/ 21 ноября 2017

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

Примечание: следующий код расширяется от ответа Равинды и ng представляет собой JButton:

ng.addActionListener((ActionEvent e) -> {
    setVisible(false);
    JFrame j = new JFrame("NAME");
    j.setVisible(true);
    j.addWindowListener(new java.awt.event.WindowAdapter() {
        @Override
        public void windowClosing(java.awt.event.WindowEvent windowEvent) {
            setVisible(true);
        }
    });
});
1 голос
/ 04 сентября 2017

Это может работать:

jdialog.addWindowListener(new WindowAdapter() {
    public void windowClosed(WindowEvent e) {
        System.out.println("jdialog window closed event received");
    }

    public void windowClosing(WindowEvent e) {
        System.out.println("jdialog window closing event received");
    }
});

Источник: https://alvinalexander.com/java/jdialog-close-closing-event

0 голосов
/ 18 апреля 2016

Попробуйте:

setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);

Это будет работать.

...