2012-02-01 34 views
66

C'è un modo per "fare qualcosa" in qualche modo quando faccio clic sul pulsante di chiusura rosso sulla barra del titolo di un JFrame? Quello che voglio fare è chiamare un metodo chiamato confirmExit() quando si fa clic su questo pulsante. Finora, l'unica opzione che ho è di non far nulla, ma non voglio quello. Come posso realizzare questo?Fai qualcosa quando fai clic sul pulsante di chiusura su un JFrame

Grazie in anticipo.

risposta

107
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); 
     } 
    } 
}); 
+1

si chiude ancora quando non si fa clic. C'è un modo per prevenirlo? – WVrock

+9

@WVrock 'setDefaultCloseOperation (DO_NOTHING_ON_CLOSE);' –

+0

Grazie, funziona. – WVrock

24

Override windowClosing Method.

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

Sarà questo lavoro se l'utente chiude l'applicazione (ad esempio, premendo Cmd + Q su un Mac)? La classe che implementa questo metodo deve dichiarare 'implements WindowListener' perché questo codice funzioni? Se è così, potrebbe essere bello includerlo nella risposta. Altrimenti questa è una soluzione elegante. – brandaemon

5
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

funziona anche. Prima crea un frame chiamato JFrame, quindi aggiungi questo codice sotto.

+7

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

+0

Fa la stessa cosa anche se – Russell

+10

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

0

Prova questo:

setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); 

Funzionerà.

0

questo può 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 è quello che ho messo come opzione di menu in cui ho fatto un pulsante su un JFrame per visualizzare un'altra JFrame. Volevo solo che il nuovo fotogramma fosse visibile e non distruggere quello dietro. Inizialmente ho nascosto il primo JFrame, mentre quello nuovo è diventato visibile. Alla chiusura del nuovo JFrame, l'ho smaltito seguito da un'azione di rendere nuovamente visibile quella precedente.

Nota: Il seguente codice si espande fuori della risposta di Ravinda e 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); 
     } 
    }); 
}); 
Problemi correlati