Запуск JFrame с помощью JProgressBar - PullRequest
3 голосов
/ 24 ноября 2011
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

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

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

Ответы [ 2 ]

9 голосов
/ 24 ноября 2011

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

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

Например,

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.

2 голосов
/ 24 ноября 2011

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

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

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

...