java jprogressbar зависает во время тяжелой работы - PullRequest
0 голосов
/ 06 сентября 2010

Я пишу Java-программу и, прежде чем вызвать метод, который интенсивно использует процессор, я отображаю фрейм с JProgressBar на нем. Хотя я отображаю его до вызова метода, JProgressBar не отображается, пока метод не завершится. Индикатор выполнения никак не взаимодействует с методом (пока), поэтому я запутался. Это что-то вроде:

progressbarframe.setVisible(true); // it is a indeterminate progress bar
heavyLoadMethod();
progressbarframe.dispose();

Кадр показывает, но индикатор выполнения не инициализируется во время метода. Есть ли способ решить эту проблему без использования потоков? Какой бы самый простой способ?

Спасибо за ваше время

Ответы [ 2 ]

3 голосов
/ 06 сентября 2010

Вы должны вызвать heavyLoadMethod в отдельном потоке.Вы можете использовать java.util.concurrent.Executor для этого:

Executor executor = java.util.concurrent.Executors.newSingleThreadExecutor();
executor.submit(new Runnable() { public void run() { heavyLoadMethod();}});

Теперь метод будет вызываться в отдельном потоке, и индикатор выполнения будет отображаться правильно.

1 голос
/ 06 сентября 2010

Вы блокируете EDT от перекрашивания GUI.

Прочитайте раздел из учебника по Swing по Параллельность в Swing для полного объяснения проблемы.

Кроме того, прочитайте раздел «Как использовать индикаторы выполнения» для рабочего примера.

...