¿Cómo capturar un evento de clic de botón JFrame?

Quiero llamar a un método confirmExit() cuando se hace clic en el botón rojo de cerrar de la barra de título de un JFrame.

¿Cómo puedo capturar ese evento?

También me gustaría evitar que la ventana se cierre si el usuario decide no continuar.

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

Si también desea evitar que la ventana se cierre a menos que el usuario elija ‘Sí’, puede agregar:

 frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 

Anular el método de cierre de la ventana.

 public void windowClosing(WindowEvent e) 

Se invoca cuando una ventana está en proceso de cerrarse. La operación de cierre puede anularse en este punto.

  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

también funciona Primero crea un marco JFrame llamado, luego agrega este código debajo.

Esto puede funcionar:

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

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

Esto es lo que puse como una opción de menú donde hice un botón en un JFrame para mostrar otro JFrame . Solo quería que el nuevo marco fuera visible y no destruir el que estaba detrás. Inicialmente oculté el primer JFrame , mientras que el nuevo se hizo visible. Al cerrar el nuevo JFrame , me deshice de él seguido de una acción de volver a hacer visible el anterior.

Nota: El siguiente código se expande fuera de la respuesta de Ravinda y ng es 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); } }); }); 

Prueba esto:

 setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); 

Funcionará.