¿Cuál es la forma correcta de terminar una aplicación Swing desde el código y cuáles son las trampas?
Intenté cerrar mi aplicación automáticamente después de que se activara un temporizador. Pero simplemente llamar dispose()
al JFrame
no funcionó: la ventana desapareció pero la aplicación no se cerró. Sin embargo, al cerrar la ventana con el botón cerrar, la aplicación finaliza. ¿Qué tengo que hacer?
Respuestas:
Su acción de cierre predeterminada de JFrame se puede establecer en "
DISPOSE_ON_CLOSE
" en lugar deEXIT_ON_CLOSE
(no entiendo por qué la gente sigue usando EXIT_ON_CLOSE).Si tiene ventanas no desechadas o subprocesos que no son demonios, su aplicación no terminará. Esto debería considerarse un error (y solucionarlo con System.exit es una muy mala idea).
Los culpables más comunes son java.util.Timer y un hilo personalizado que ha creado. Ambos deben establecerse en demonio o deben eliminarse explícitamente.
Si desea verificar todos los marcos activos, puede usar
Frame.getFrames()
. Si se eliminan todos los Windows / Frames, utilice un depurador para comprobar si hay subprocesos que no sean demonios y que aún se estén ejecutando.fuente
back
ventana? Si la segunda ventana se cierra y usas,DISPOSE_ON_CLOSE
el programa no termina porque la primera ventana aún está "sin eliminar" ... ¿hay alguna manera de resolver eso sin usarDISPOSE_ON_CLOSE
?Supongo que EXIT_ON_CLOSE
antes
System.exit(0)
es mejor, ya que puede escribir un escucha de ventana para realizar algunas operaciones de limpieza antes de salir de la aplicación.Ese oyente de ventana le permite definir:
fuente
Tratar:
Crudo, pero efectivo.
fuente
Puede que la forma segura sea algo como:
fuente
Frame
con una letra mayúscula, exactamente como el nombre de una clase…El siguiente programa incluye código que terminará un programa que carece de subprocesos extraños sin llamar explícitamente a System.exit (). Para aplicar este ejemplo a aplicaciones que usan hilos / oyentes / temporizadores / etc., solo es necesario insertar el código de limpieza solicitando (y, si corresponde, esperando) su terminación antes de que WindowEvent se inicie manualmente dentro de actionPerformed ().
Para aquellos que deseen copiar / pegar código capaz de ejecutarse exactamente como se muestra, al final se incluye un método principal un poco feo pero por lo demás irrelevante.
fuente
Si le entiendo correctamente, desea cerrar la aplicación incluso si el usuario no hizo clic en el botón cerrar. Deberá registrar WindowEvents tal vez con addWindowListener () o enableEvents (), lo que mejor se adapte a sus necesidades.
Luego, puede invocar el evento con una llamada a processWindowEvent (). Aquí hay un código de muestra que creará un JFrame, esperará 5 segundos y cerrará el JFrame sin interacción del usuario.
Como puede ver, el método processWindowEvent () hace que se active el evento WindowClosed donde tiene la oportunidad de hacer algo de código de limpieza si lo necesita antes de cerrar la aplicación.
fuente
Eche un vistazo a la documentación de Oracle .
A partir de JDK 1.4, una aplicación termina si:
Esquineros:
El documento establece que algunos paquetes crean componentes que se pueden visualizar sin liberarlos. Un programa que llame a Toolkit.getDefaultToolkit () no terminará. se da, entre otros, como ejemplo.
Además, otros procesos pueden mantener vivo a AWT cuando, por cualquier motivo, envían eventos a la cola de eventos nativa.
También noté que en algunos sistemas se tarda un par de segundos antes de que la aplicación finalice.
fuente
Creo que la idea está aquí en WindowListener: puede agregar cualquier código allí que le gustaría ejecutar antes de que se apague.
fuente
En respuesta a otros comentarios, DISPOSE_ON_CLOSE no parece salir correctamente de la aplicación; solo destruye la ventana, pero la aplicación seguirá ejecutándose. Si desea terminar la aplicación, use EXIT_ON_CLOSE.
fuente