Question

J'ai un cadre de connexion que je dois attendre d'un autre fil. Sur cadre de connexion réussie s'aliène. Et je veux faire apparaître le cadre principal pour l'application. En ce moment, je regarde une valeur booléenne pour déterminer quand le feu le cadre principal. Quelle est la bonne façon de le faire? Regarder une valeur booléenne juste ne se sent pas élégant.

Était-ce utile?

La solution

Si vous avez Java 5 ou version ultérieure disponible, vous pouvez utiliser un CountDownLatch . Par exemple, en supposant que le cadre principal est le contrôle au départ, ont le châssis principal créer le CountDownLatch avec un compte à rebours de 1 et passer ce verrou au cadre de connexion. Alors le cadre principal pour attendre le verrou pour devenir 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();

Avoir le cadre de connexion, lorsque vous avez terminé, décrémenter le verrou:

loginSignal.countDown();

Assurez-vous qu'il n'y a aucun moyen pour votre cadre de connexion pour quitter où il oublie de décrémenter le verrou! Dès que le CountDownLatch atteint 0, le cadre principal devient runnable.

Vous pouvez également utiliser un Semaphore ou Condition ( ou l'un des quelques autres choix de java.util.concurrent), mais à cet effet, un CountDownLatch semble plus facile à utiliser.

Autres conseils

Ce que vous devez vraiment comprendre à traiter avec Swing (et en fait AWT), est que vous devez garder toutes les interactions avec les composants du fil AWT Dispatch Event (HAE).

Alors, faites la connexion de l'EDT. Utilisez un new Thread, ou mieux un java.util.concurrent.ExecutorService. Lorsque vous découvrez que vous avez été connecté, utilisez java.awt.EventQueue.invokeLater pour revenir sur l'EDT. Anonyme classe interne sont parfaits pour capturer le contexte et, en dépit de leur syntaxe effroyablement bavard, ce qui rend le code plus court.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top