Создать новый поток для подсчета, ожидания и обновления графического интерфейса.
Вы выполняете всю эту работу в потоке диспетчеризации событий, который является единственным потоком, который обновляет графический интерфейс. Поэтому, когда вы устанавливаете текст метки, он не обновляется на экране до тех пор, пока метод не вернется, а поток отправки событий обработает операцию перерисовки.
Для этого вам нужно создать новый поток, а не просто запустить его в цикле, который выполняется немедленно. Просто используйте метод actionPerformed
, создающий новый Thread
, который обрабатывает это вместо этого. Цикл, счет и обновление в этой теме, ожидая с Thread.sleep
между обновлениями. Чтобы обновить текст метки, создайте новый Runnable
, который обновит метку до следующего значения, и поместите его в поток обработки событий с помощью SwingUtilities.invokeLater
. Держите этот поток в фоновом режиме, пока он вам не понадобится. Я бы порекомендовал проверять логическое состояние выключения при каждом прохождении цикла и выходить, когда для него установлено значение false. Таким образом, вы можете в любое время аккуратно закрыть поток. Или, если вы хотите, чтобы он выполнял обратный отсчет и издавал звуковой сигнал только один раз, вы можете завершить поток после одной итерации подсчета.
Есть много вопросов о переполнении стека, которые детализируют каждый из этих шагов, поэтому я не буду повторять эту информацию здесь.