2013-04-03 1 views
2

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

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

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

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

    Update progress bar ; 
} 

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

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

Спасибо!

+3

Пожалуйста, прочтите [Параллелизм в свинг] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/). – mre

+1

См. Также этот [пример] (http://stackoverflow.com/a/4637725/230513). – trashgod

ответ

3

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

1

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

+0

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

+0

Ах круто. Не уверен. У меня были проблемы с перекрашиванием в прошлом, поэтому я подумал, что просто упомянул об этом. – WereWolfBoy

2

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

Пожалуйста, обратите внимание:

+0

неверен, но не весь рассказ: весь доступ к просмотру зависит от конкретного потока, зловещего EDT :-) – kleopatra