Сделайте что-нибудь, когда кнопка закрытия нажата на JFrame

Есть ли способ каким-то образом "сделать что-то", когда я нажимаю красную кнопку закрытия в строке заголовка JFrame? То, что я хочу сделать, - вызвать метод под названием confirmExit() при нажатии этой кнопки. Пока что единственный вариант, который у меня есть, это заставить его ничего не делать, но я этого не хочу. Как это сделать?

Спасибо заранее.

Ответ 1

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

Ответ 2

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

public void windowClosing(WindowEvent e)

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

Ответ 3

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

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

Ответ 4

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

Примечание. Следующий код расширяет ответ Ravinda, а 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);
        }
    });
});

Ответ 5

Попробуйте следующее:

setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);

Он будет работать.

Ответ 6

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

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