2012-02-01 22 views
66

¿Hay alguna forma de 'hacer algo' cuando hago clic en el botón rojo de cerrar en la barra de título de un JFrame? Lo que quiero hacer es llamar a un método llamado confirmExit() cuando se hace clic en dicho botón. Hasta ahora, la única opción que tengo es hacer que no haga nada, pero no quiero eso. ¿Cómo logro esto?Haga algo cuando se hace clic en el botón Cerrar en un JFrame

Gracias de antemano.

Respuesta

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

la ventana aún se cierra cuando no se hace clic en No. ¿Hay una forma de prevenirlo? – WVrock

+9

@WVrock 'setDefaultCloseOperation (DO_NOTHING_ON_CLOSE);' –

+0

Gracias, funciona. – WVrock

24

Anular ventanaMétodo de cierre.

public void windowClosing(WindowEvent e) 

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

+3

¿Funcionará si el usuario cierra la aplicación (por ejemplo, pulsando Cmd + Q en Mac)? ¿La clase que implementa este método tiene que declarar 'implementa WindowListener' para que este código funcione? Si es así, podría ser bueno incluir eso en la respuesta. De lo contrario, esta es una solución elegante. – brandaemon

5
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

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

+7

Pero esto no ejecuta el método 'confirmExit()' como le gustaría al OP – hage

+0

Hace lo mismo aunque – Russell

+10

No, no quiero simplemente cerrar el programa. Quiero hacer algo antes de que suceda. – alxcyl

0

Prueba esto:

setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); 

Se trabajará.

0

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

1

Esto es lo que he puesto como una opción de menú en el que hice un botón en una JFrame para mostrar otra 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, lo eliminé 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); 
     } 
    }); 
}); 
Cuestiones relacionadas