Java esperar a que termine JFrame
Pregunta
Tengo un marco de inicio de sesión que tengo que esperar a que de otro hilo. Tras el éxito del marco de inicio de sesión se deshace en sí. Y quiero que aparezca el marco principal para la aplicación. En este momento estoy viendo un valor booleano para determinar cuándo el fuego de la estructura principal. ¿Cuál es la forma correcta de hacer esto? Ver a un valor booleano simplemente no se siente elegante.
Solución
Si usted tiene Java 5 o posterior disponible, se puede utilizar un CountDownLatch . Por ejemplo, suponiendo que el bastidor principal está en control inicialmente, tiene la estructura principal crear el CountDownLatch
con una cuenta atrás de 1 y pasar este pestillo para el bastidor de inicio de sesión. Entonces tener la espera de marco principal para el pestillo se convierta en 0:
CountDownLatch loginSignal = new CountDownLatch(1);
... // Initialize login frame, giving it loginSignal
... // execute login frame in another Thread
// This await() will block until we are logged in:
loginSignal.await();
Haga que el marco de inicio de sesión, cuando se hace, disminuir el pestillo:
loginSignal.countDown();
Asegúrese de que no hay manera para que su marco de inicio de sesión para salir de donde se olvida de disminuir el pestillo! Tan pronto como el CountDownLatch
llega a 0, el bastidor principal se vuelve ejecutable.
También es posible usar un Semaphore
o Condition
( o cualquiera de algunas otras opciones de java.util.concurrent
), pero para este propósito, una CountDownLatch
parece más fácil de usar.
Otros consejos
Lo que realmente debe entender con el trato con Swing (y de hecho AWT), es que se necesita para mantener a toda la interacción con los componentes de la rosca AWT Evento de Despacho (EDT).
Por lo tanto, hacer el login de la EDT. Use un new Thread
, o mejor un java.util.concurrent.ExecutorService
. Cuando se descubre que se le ha conectado, utilice java.awt.EventQueue.invokeLater
para volver a la EDT. Anónimo clase interna son grandes para la captura de contexto y, a pesar de su sintaxis tremendamente detallado, haciendo que el código más corto.