Come catturare un evento clic sul pulsante di chiusura di JFrame?


87

Voglio chiamare un metodo confirmExit()quando si fa clic sul pulsante di chiusura rosso della barra del titolo di un JFrame.

Come posso catturare quell'evento?

Vorrei anche impedire la chiusura della finestra se l'utente decide di non procedere.

Risposte:


149
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);
        }
    }
});

Se vuoi anche impedire la chiusura della finestra a meno che l'utente non scelga "Sì", puoi aggiungere:

frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

25

Ignora il metodo di chiusura della finestra.

public void windowClosing(WindowEvent e)

Viene richiamato quando una finestra è in fase di chiusura. L'operazione di chiusura può essere sovrascritta a questo punto.


3
Funzionerà se l'utente chiude l'applicazione (ad esempio, premendo Cmd + Q su un Mac)? La classe che implementa questo metodo deve dichiarare implements WindowListeneraffinché questo codice funzioni? In tal caso, potrebbe essere utile includerlo nella risposta. Altrimenti questa è una soluzione elegante.
intcreator

@brandaemon Se aggiungi questa riga di codice all'inizio del metodo main () "System.setProperty (" apple.eawt.quitStrategy "," CLOSE_ALL_WINDOWS ");" quindi chiamerà windowListener quando Cmd + Q viene premuto su Mac.
retrovius

2
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

funziona anche. Per prima cosa crea un JFrame chiamato frame, quindi aggiungi questo codice sotto.


9
Ma questo non esegue il confirmExit()metodo come vorrebbe l'OP
hage

Fa la stessa cosa però
Russell

11
No, non voglio chiudere semplicemente il programma. Voglio fare qualcosa prima che accada.
alxcyl

oh scusa, non lo sapevo.
Russell

1
"Quello che voglio fare è chiamare ... confirmExit()quando si fa clic su [X]." E il commento precedente non è correlato a OQ.
DSlomer64

1

Questo potrebbe funzionare:

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");
    }
});

Fonte: https://alvinalexander.com/java/jdialog-close-closing-event


1

Questo è ciò che ho inserito come opzione di menu in cui ho creato un pulsante su a JFrameper visualizzarne un altro JFrame. Volevo che solo il nuovo frame fosse visibile e non distruggesse quello dietro di esso. Inizialmente ho nascosto il primo JFrame, mentre il nuovo è diventato visibile. Alla chiusura del nuovo JFrame, l'ho smaltito seguito da un'azione per rendere nuovamente visibile quello vecchio.

Nota: il codice seguente si espande dalla risposta di Ravinda ed ngè un 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);
        }
    });
});

-2

Prova questo:

setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);

Funzionerà.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.