¿Cuál es la forma correcta JFrame
de cerrar, lo mismo que si el usuario hubiera presionado el X
botón de cerrar o presionado Alt+ F4(en Windows)?
Tengo mi operación de cierre predeterminada configurada de la manera que quiero, a través de:
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Hace exactamente lo que quiero con los controles antes mencionados. Esta pregunta no se trata de eso.
Lo que realmente quiero hacer es hacer que la GUI se comporte de la misma manera que presionar el X
botón de cerrar haría que se comportara.
Supongamos que extiendo WindowAdaptor
y luego agrego una instancia de mi adaptador como un oyente a través de addWindowListener()
. Me gustaría ver la misma secuencia de llamadas a través windowDeactivated()
, windowClosing()
y windowClosed()
como ocurriría con el X
botón de cierre. No tanto romper la ventana como decirle que se rompa, por así decirlo.
Respuestas:
Si desea que la GUI se comporte como si hiciera clic en el
X
botón de cierre, debe enviar un evento de cierre de ventana alWindow
. ElExitAction
de cerrar una aplicación le permite añadir esta funcionalidad a un elemento de menú o cualquier componente que utilizaAction
s fácilmente.fuente
No muy complicado.
fuente
Si con Alt-F4 o X te refieres a "Salir de la aplicación inmediatamente sin tener en cuenta qué otras ventanas o subprocesos se están ejecutando", entonces
System.exit(...)
hará exactamente lo que quieras de una manera muy brusca, con fuerza bruta y posiblemente problemática.Si con Alt-F4 o X te refieres a ocultar la ventana, entonces
frame.setVisible(false)
es cómo "cierras" la ventana. La ventana continuará consumiendo recursos / memoria, pero se puede volver a hacer visible muy rápidamente.Si con Alt-F4 o X te refieres a ocultar la ventana y eliminar cualquier recurso que esté consumiendo, entonces
frame.dispose()
es cómo "cierras" la ventana. Si el marco era la última ventana visible y no hay otros subprocesos no daemon en ejecución, el programa se cerrará. Si vuelve a mostrar la ventana, tendrá que reinicializar todos los recursos nativos nuevamente (búfer de gráficos, identificadores de ventana, etc.).dispose()
podría estar más cerca del comportamiento que realmente quieres. Si su aplicación tiene varias ventanas abiertas, ¿desea que Alt-F4 o X salgan de la aplicación o simplemente cierren la ventana activa?El Tutorial de Java Swing sobre Window Listeners puede ayudarlo a aclarar las cosas por usted.
fuente
Si ha hecho esto para asegurarse de que el usuario no pueda cerrar la ventana:
Entonces deberías cambiar tu
pullThePlug()
método para serEncontré que esta es la única manera que juega bien con el
WindowListener
yJFrame.DO_NOTHING_ON_CLOSE
.fuente
Estas serían tus opciones:
fuente
Salir del proceso de ejecución de Java es muy fácil, básicamente debes hacer solo dos cosas simples:
System.exit(...)
en el punto de cierre de la aplicación. Por ejemplo, si su aplicación está basada en marcos, puede agregar oyenteWindowAdapter
y llamarSystem.exit(...)
dentro de su métodowindowClosing(WindowEvent e)
.Nota: debe llamar, de lo
System.exit(...)
contrario, su programa implica un error.System.exit(...)
en el punto correcto, pero no significa que se pueda llamar siempre al método, ya que las excepciones inesperadas de Java pueden evitar que se llame al método.Esto está fuertemente relacionado con tus habilidades de programación.
** A continuación se muestra una muestra más simple (
JFrame
basada) que muestra cómo llamar al método de salidafuente
No solo para cerrar JFrame sino también para activar eventos WindowListener, intente esto:
fuente
La mejor manera de cerrar un marco Swing mediante programación es hacer que se comporte como lo haría cuando se presiona el botón "X". Para hacerlo, deberá implementar WindowAdapter que se adapte a sus necesidades y establecer la operación de cierre predeterminada del marco para que no haga nada (DO_NOTHING_ON_CLOSE).
Inicialice su marco así:
Puede cerrar el marco mediante programación enviándole el evento WINDOW_CLOSING, de esta manera:
Esto cerrará el marco como se presionó el botón "X".
fuente
Si realmente no desea que su aplicación finalice cuando se cierra un JFrame, entonces,
utilizar :
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
en vez de :
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Aquí hay una sinopsis de cómo se ve la solución,
fuente
Esta respuesta fue dada por Alex y me gustaría recomendarla. Funcionó para mí y otra cosa es sencilla y muy simple.
fuente
Este ejemplo muestra cómo realizar la operación de cierre de ventana confirmada.
La ventana tiene un adaptador de ventana que cambia la operación de cierre predeterminada
EXIT_ON_CLOSE
oDO_NOTHING_ON_CLOSE
depende de su respuesta en elOptionDialog
.El método
closeWindow
deConfirmedCloseWindow
disparar un evento de cerrar ventana y puede usarse en cualquier lugar, es decir, como una acción de un elemento de menúfuente
Según las respuestas que ya se proporcionan aquí, esta es la forma en que lo implementé:
El JFrame cierra el evento y, al cerrar, sale.
fuente
Debe insertar la llamada en la cola de mensajes de AWT para que todos los tiempos ocurran correctamente, de lo contrario no enviará la secuencia de eventos correcta, especialmente en un programa de subprocesos múltiples. Cuando se hace esto, puede manejar la secuencia de eventos resultante exactamente como lo haría si el usuario hubiera hecho clic en el botón [x] para un JFrame decorado con sistema operativo.
fuente
He intentado esto, escriba su propio código para el evento formWindowClosing () .
Esto le pregunta al usuario si quiere salir del Marco o la Aplicación.
fuente
Publicar lo que había en el cuerpo de la pregunta como respuesta de CW.
Quería compartir los resultados, principalmente derivados del siguiente enlace de camickr. Básicamente necesito lanzar un
WindowEvent.WINDOW_CLOSING
en la cola de eventos de la aplicación. Aquí hay una sinopsis de cómo se ve la soluciónfuente
Si no desea que su aplicación finalice cuando se cierra un JFrame, use: setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE)
en lugar de: setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
De la documentación:
DO_NOTHING_ON_CLOSE (defined in WindowConstants)
: No hagas nada; requiere que el programa maneje la operación en el método windowClosing de un objeto WindowListener registrado.HIDE_ON_CLOSE (defined in WindowConstants)
: Ocultar automáticamente el marco después de invocar cualquier objeto registrado de WindowListener.DISPOSE_ON_CLOSE (defined in WindowConstants)
: Oculta y desecha automáticamente el marco después de invocar cualquier objeto registrado de WindowListener.EXIT_ON_CLOSE (defined in JFrame)
: Salga de la aplicación utilizando el método de salida del sistema. Use esto solo en aplicaciones.aún puede ser útil: puede usarlo
setVisible(false)
en su JFrame si desea mostrar el mismo marco nuevamente. De lo contrario, llamedispose()
para eliminar todos los recursos de la pantalla nativa.copiado de Peter Lang
https://stackoverflow.com/a/1944474/3782247
fuente
fuente
setVisible(false)
.setVisible(false); .setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);