JFrame зависает во время цикла while

Я работаю над программой Java, которая читает текстовые файлы, выполняет некоторые расчеты вероятности. Чтение файлов и все связанные с ними вычисления выполняются в цикле while.

Я создал графический интерфейс, используя JFrame, где я добавил индикатор выполнения (используя JProgressBar), чтобы показать прогресс, поскольку программе требуется некоторое время для обработки файлов.

Код выглядит так -

while( there are more files to read )
{
    Read this file ;
    Do calculations ;

    Update progress bar ;
}

Теперь проблема заключается в том, что после запуска цикла while и обработки первого файла JFrame просто зависает. Индикатор выполнения не обновляется, и я не могу нажать ни одну кнопку в JFrame. Как только цикл while завершается, кадр обновляется, а индикатор выполнения обновляется до своего конечного значения (следовательно, индикатор выполнения начинается с 0, затем приостанавливается и, наконец, достигает 100).

Может ли кто-нибудь объяснить, почему JFrame зависает? Можно ли обновить его (индикатор выполнения в JFrame) в итерациях цикла while?

Спасибо !


person Ankit Rustagi    schedule 03.04.2013    source источник
comment
Прочтите Параллелизм в Swing.   -  person mre    schedule 03.04.2013
comment
См. также этот связанный пример.   -  person trashgod    schedule 03.04.2013


Ответы (3)


Вы выполняете свою интенсивную задачу в потоке отправки событий (EDT). Это плохая идея, поскольку EDT также обновляет пользовательский интерфейс. Поэтому, если этот поток заблокирован, обновление пользовательского интерфейса не выполняется.

person Uwe Plonus    schedule 03.04.2013

Решение состоит в том, чтобы использовать threads, потому что вы зависаете, вы делаете все одновременно.

Пожалуйста, посмотрите:

person Castiblanco    schedule 03.04.2013
comment
не неверно, но и не вся история: весь доступ, связанный с просмотром свинга, должен происходить в определенном потоке, зловещем EDT :-) - person kleopatra; 03.04.2013

Поток может выполнять только одно действие за раз. Поэтому, если вы позволите ему выполнять вычисления, он не будет обновлять графический интерфейс. Поэтому вам следует использовать другую нить. Также вам, вероятно, потребуется перекрасить графический интерфейс.

person WereWolfBoy    schedule 03.04.2013
comment
Если вы используете другой поток для чтения файлов, вам не нужно перерисовывать вручную, поскольку это обычно делает EDT. - person Uwe Plonus; 03.04.2013
comment
Ах круто. Не был уверен. У меня были проблемы с перекрашиванием в прошлом, поэтому я решил просто упомянуть об этом. - person WereWolfBoy; 03.04.2013