У меня есть JFrame
с CardLayout
, установленным в качестве менеджера раскладки.Это имеет два JPanel
подкласса в нем.Одним из них является панель WordsLoadingPanel
, которая отображает текст «Загрузка слов ...» и имеет JProgressBar
.Другой должен загрузить слова.Это занимает некоторое время (около 10-14 секунд для 100 слов; это довольно избирательный алгоритм), поэтому я хочу заверить пользователя, что программа все еще работает.Я заставил алгоритм загрузки в панели вызывать изменение свойства с firePropertyChange(String, int, int)
, и WordsLoadingPanel
замечательно фиксирует это изменение - я знаю это, потому что я добавил прослушиватель для этого события для выполнения println
, и он работает,Однако, когда я изменяю println
на фактическое изменение значения JProgressBar
, это ничего не делает.Я знаю, что я изменяю значение правильно, потому что, если я устанавливаю значение до запуска алгоритма, он работает, и , он работает на последней итерации цикла.Я предполагаю, что это потому, что мой алгоритм потребляет вычислительную мощность и не позволяет обновлять * 1013.
Итак, мой вопрос: как заставить мой алгоритм ждать Swing (будет ли этоAWT Dispatching Thread?) Чтобы завершить обновление индикатора выполнения, прежде чем продолжить?Я пытался:
Thread.yield
в каждой итерации цикла Thread.sleep(1000L)
в каждой итерации цикла, в try / catch - помещая все в цикл в
SwingUtilities.invokeLater(Runnable)
- добавляя только процессорозатратный алгоритм в
SwingUtilities.invokeLater(Runnable)
РЕДАКТИРОВАТЬ: Для дальнейшей поддержки моей гипотезы алгоритма использования ЦП(звучит как детская история…), когда я устанавливаю JProgressBar
на неопределенный, он начинает двигаться только после , когда алгоритм завершает работу.
У кого-нибудь есть какие-либо предложения?
Спасибо!