Вопрос

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

Это было полезно?

Решение

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

Попросите фрейм входа в систему, когда закончите, уменьшите защелку:

loginSignal.countDown();

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top