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:
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);
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.
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
funziona anche. Per prima cosa crea un JFrame chiamato frame, quindi aggiungi questo codice sotto.
confirmExit()
metodo come vorrebbe l'OP
confirmExit()
quando si fa clic su [X]." E il commento precedente non è correlato a OQ.
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
Questo è ciò che ho inserito come opzione di menu in cui ho creato un pulsante su a JFrame
per 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);
}
});
});
Prova questo:
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
Funzionerà.
implements WindowListener
affinché questo codice funzioni? In tal caso, potrebbe essere utile includerlo nella risposta. Altrimenti questa è una soluzione elegante.