2010-10-08 22 views
13

¿Cuál es el equivalente programático de hacer clic en el botón Cerrar (x) en la esquina superior derecha de JFrame?Cierre programático de JFrame

Hay el método dispose() pero eso no es lo mismo, desde un JFrame se puede configurar para hacer varias cosas diferentes al cerrar (por no hablar de si hay un implicado WindowListener)

+1

+1. Siempre me he preguntado esto, pero nunca me tomé el tiempo para preguntar. – Andy

Respuesta

16

Es decir el componente para enviar un evento . En este caso, desea enviar un evento de cierre de ventana.

private void exit() { 
    this.dispatchEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING)); 
} 
+0

Genial, eso es lo que estaba buscando. Sin embargo, creo que debes usar Swing.invokeLater() para asegurarte de que esté en el hilo de envío del evento. –

+0

@ Jason, si esto se llama desde un componente Swing, entonces ya está en el EDT. Es por eso que nunca desea hacer cálculos largos dentro de un componente Swing. (Porque bloquearían el EDT) – jjnguy

+0

Derecha. Pero quiero llamarlo desde otro componente. (Utilicé 'public void closeWindow()' como mi firma). –

2

Al llegar a la X en un JFrame, el sistema se puede configurar para hacer varias cosas. El valor predeterminado es que la ventana simplemente está oculta con setVisible (falso), creo.

Puede establecer un marco para hacer cosas diferentes al cerrar - puede hacer que disponga, oculte o llame al código según setDefaultCloseOperation. Aquí están las opciones:

DO_NOTHING_ON_CLOSE: No hagas nada; requiere que el programa maneje la operación en el método windowClosing de un objeto WindowListener registrado.

HIDE_ON_CLOSE: Oculta automáticamente el marco después de invocar cualquier objeto WindowListener registrado.

DISPOSE_ON_CLOSE: Oculte y elimine automáticamente el marco después de invocar cualquier objeto WindowListener registrado.

EXIT_ON_CLOSE: salga de la aplicación utilizando el método de salida del sistema. Use esto solo en aplicaciones.

Pero creo que lo que buscas es setVisible (falso).

0

Debe insertar la llamada en la cola de mensajes de AWT para que todo el tiempo ocurra correctamente; de ​​lo contrario, no distribuirá la secuencia de eventos correcta, especialmente en un programa de subprocesos múltiples.

public void closeWindow() 
{ 
    if(awtWindow_ != null) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       awtWindow_.dispatchEvent(new WindowEvent(awtWindow_, WindowEvent.WINDOW_CLOSING)); 
      } 
     }); 
    } 
}