Як зафіксувати подію натискання кнопки закриття JFrame?


86

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

Як я можу зафіксувати цю подію?

Я також хотів би запобігти закриттю вікна, якщо користувач вирішить не продовжувати.

Відповіді:


147
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

Замінити вікно Метод закриття.

public void windowClosing(WindowEvent e)

Він викликається, коли вікно закривається. На даний момент операцію закриття можна замінити.


3
Чи спрацює це, якщо користувач закриє програму (наприклад, натиснувши Cmd + Q на Mac)? Чи повинен клас, який реалізує цей метод, оголосити, implements WindowListenerщоб цей код працював? Якщо так, можливо, було б добре включити це у відповідь. В іншому випадку це елегантне рішення.
intcreator

@brandaemon Якщо ви додасте цей рядок коду у верхню частину методу main () "System.setProperty (" apple.eawt.quitStrategy "," CLOSE_ALL_WINDOWS ");" тоді він буде викликати windowListener при натисканні Cmd + Q на mac.
retrovius

2
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

також працює. Спочатку створіть JFrame, який називається фреймом, а потім додайте цей код знизу.


9
Але це не виконує confirmExit()метод, як того хотів би ОП
hage

Однак робить те саме
Рассел

11
Ні, я не хочу просто закривати програму. Я хочу зробити щось до того, як це станеться.
alxcyl

ой вибачте, я цього не знав.
Рассел

1
"Що я хочу зробити, це зателефонувати ... confirmExit()коли клацне [X]". І попередній коментар не пов’язаний з OQ.
DSlomer64,


1

Це те, що я поставив як пункт меню, де я зробив кнопку на, 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);
        }
    });
});

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.