2011-01-28 15 views
11

La aplicación Swing típica inicia el EDT al principio y cuando se cierra la última ventana, la Aplicación se detiene básicamente con un System.exit implícito o explícito.Cómo detener el Swing EDT

Pero mi pequeña aplicación es en realidad un complemento para un framework que no sabe nada de Swing. Mi complemento, cuando se llame, mostrará un cuadro de diálogo, para obtener una entrada del usuario y salir luego, pero el marco deberá/seguirá funcionando. Entonces no puedo llamar al System.exit.

Pero si no lo hago que la EDT continuará funcionando y una vez finalizado el marco de la EDT todavía va a correr y correr y correr ...

así que me gustaría matar al EDT sin matando la aplicación. ¿Cómo puedo hacer eso?

Respuesta

11

El siguiente documento de Oracle/Sun arrojar alguna luz sobre el tema: AWT Threading Issues

[...]

Antes de 1,4, las hebras de ayuda nunca fueron terminados.

A partir de 1.4, el comportamiento ha cambiado como resultado de la corrección para 4030718. Con la implementación actual, AWT termina todas sus hebras de ayuda que permite la aplicación para salir limpiamente cuando se cumplen las tres condiciones siguientes:

  • No hay componentes desplegables AWT o Swing.
  • No hay eventos nativos en la cola de eventos nativos.
  • No hay eventos AWT en Java EventQueues.

Por lo tanto, una aplicación de AWT independiente que desea salir limpiamente sin llamar System.exit debe:

  • Asegúrese de que todos los componentes AWT o swing están hechos sean visualizables cuando la aplicación termina. Esto se puede hacer llamando a Window.dispose en todos los niveles superiores de Windows. Ver Frame.getFrames. ...
  • Asegúrese de que ningún método de escucha de eventos AWT registrado por la aplicación con ningún componente AWT o Swing puede ejecutarse en un bucle infinito o suspenderse indefinidamente. Por ejemplo, un método de escucha AWT desencadenado por algún evento AWT puede publicar un nuevo evento AWT del mismo tipo en EventQueue. El argumento es que los métodos de los detectores de eventos AWT se suelen ejecutar en hilos auxiliares.

[...]

+2

Hay algún problema, IIRC. Debe asegurarse de "eliminar" ** todos ** sus recursos. –

0

Puede haber algunas ventanas ocultas (por ejemplo, el uso de diálogos que aparecen JOptionPane.showMessageDialog(…) que ya están cerrados) la prevención de oscilación de la salida. Esto se puede comprobar mediante

Stream.of(Window.getWindows()).forEach(System.out::println); 

Si no los necesita más, usted puede deshacerse de ellos fácilmente:

Stream.of(Window.getWindows()).forEach(Window::dispose); 

La distribución de eventos hilo debe luego se detiene.

Cuestiones relacionadas