Запуск JFrame с JProgressBar

public void myMethod {
   MyProgessBarFrame progFrame = new MyProgressBarFrame(); // this is a JFrame
   progFrame.setVisible(true); // show my JFrame loading

   // do some processing here while the progress bar is running
   // .....

   progFrame.setvisible(false); // hide my progress bar JFrame
} // end method myMethod

У меня есть код выше. Но когда я запускаю его, раздел обработки не обрабатывается, пока я не закрою индикатор выполнения JFrame.

Как я покажу свой индикатор выполнения и скажу Java продолжить в разделе обработки?


person epsac    schedule 24.11.2011    source источник
comment
Вы читали JProgressBar API? В нем есть ссылка на учебник по Swing на How to Monitor Progress, в котором также рассказывается о Concurrency и SwingWorkers.   -  person camickr    schedule 24.11.2011
comment
Да, camickr прав на деньги.   -  person Hovercraft Full Of Eels    schedule 24.11.2011
comment
Спасибо, парни! В настоящее время у меня нет роскоши времени на чтение. Я готовлю на проекте :-(   -  person epsac    schedule 24.11.2011
comment
Вот почему вы читаете заранее, чтобы понять основы и не тратить время на то, чтобы делать что-то не так.   -  person camickr    schedule 24.11.2011


Ответы (2)


У вас есть классическая проблема с параллелизмом и Swing. Ваша проблема заключается в том, что вы выполняете длительную задачу в основном потоке Swing, EDT или потоке отправки событий, и это заблокирует поток до завершения процесса, не позволяя ему выполнять свои задачи, включая взаимодействие с пользователем и рисование графического интерфейса.

Решение состоит в том, чтобы выполнять длительную задачу в фоновом потоке, таком как заданный объектом SwingWorker. Затем вы можете обновить индикатор выполнения (если он определяющий) через пару публикации/процесса SwingWorker. Подробнее об этом читайте в этой статье Параллелизм в Swing.

e.g.,

public void myMethod() {
  final MyProgessBarFrame progFrame = new MyProgessBarFrame();
  new SwingWorker<Void, Void>() {
     protected Void doInBackground() throws Exception {

        // do some processing here while the progress bar is running
        // .....
        return null;
     };

     // this is called when the SwingWorker's doInBackground finishes
     protected void done() {
        progFrame.setVisible(false); // hide my progress bar JFrame
     };
  }.execute();
  progFrame.setVisible(true);
}

Кроме того, если это отображается из другого компонента Swing, вам, вероятно, следует показать модальный JDialog, а не JFrame. Вот почему я вызвал setVisible(true) в окне после кода SwingWorker, чтобы, если это модальный диалог, он не мешал выполнению SwingWorker.

person Hovercraft Full Of Eels    schedule 24.11.2011
comment
Ух ты! похоже, мне нужно понять много концепций, прежде чем успешно программировать GUI на Java. Я попробовал ваш код, и он действительно работает, хотя я до сих пор не могу понять его теорию. Я прочитаю ссылку, которую вы предоставили, как только я сдам свой проект. Большое спасибо! - person epsac; 24.11.2011
comment
@Jec: Это трюизм не только для программирования с графическим интерфейсом, но и для программирования в целом. Это как найти бесконечную матрешку. - person Hovercraft Full Of Eels; 24.11.2011

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

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

*ПРИМЕЧАНИЕ: прогресс, отображаемый на индикаторе выполнения, должен зависеть от обработки, выполняемой в основном потоке.

по этим ссылкам можно найти потоки & индикатор выполнения в Java.

person gprathour    schedule 24.11.2011