Java ждет завершения JFrame - PullRequest
3 голосов
/ 29 апреля 2009

У меня есть фрейм входа, который мне нужно ждать из другого потока. При успешном входе в систему фрейм утилизирует себя. И я хочу, чтобы всплыл основной кадр для приложения. Прямо сейчас я наблюдаю логическое значение, чтобы определить, когда запустить главный кадр. Как правильно это сделать? Наблюдение логического значения просто не выглядит элегантно.

Ответы [ 2 ]

11 голосов
/ 29 апреля 2009

Если у вас есть Java 5 или более поздняя версия, вы можете использовать CountDownLatch . Например, предполагая, что основной кадр изначально находится под контролем, создайте для главного кадра CountDownLatch с обратным отсчетом 1 и передайте эту защелку кадру входа в систему. Затем заставьте основной кадр подождать, пока защелка не станет равной 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();

Имейте фрейм входа, когда закончите, уменьшите Latch:

loginSignal.countDown();

Убедитесь, что у вашего фрейма входа нет возможности выйти, где он забудет уменьшить защелку! Как только CountDownLatch достигнет 0, основной кадр станет пригодным для работы.

Вы также можете использовать Semaphore или Condition (или любой из нескольких других вариантов из java.util.concurrent), но для этой цели CountDownLatch кажется проще в использовании.

2 голосов
/ 29 апреля 2009

Что вы действительно должны понимать при работе с Swing (и на самом деле с AWT), так это то, что вам необходимо поддерживать все взаимодействие с компонентами AWT Event Dispatch Thread (EDT).

Итак, войдите с EDT. Используйте new Thread или лучше java.util.concurrent.ExecutorService. Когда вы обнаружите, что вы вошли в систему, используйте java.awt.EventQueue.invokeLater, чтобы вернуться на EDT. Анонимный внутренний класс отлично подходит для захвата контекста и, несмотря на ужасно многословный синтаксис, делает код короче.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...