Для выполнения ряда операций в фоновом режиме и создания отчетов о ходе выполнения используйте SwingWorker .
Метод background
выполняет фоновую обработку.
Используйте метод publish
для публикации периодических обновлений статуса.
Переопределите метод process
для обработки обновлений (process
всегда выполняется в EDT).
progressBar = new JProgressBar();
sw = new SwingWorker<Boolean,Integer>() {
protected Boolean doInBackground() throws Exception {
// If any of the operations fail, return false to notify done()
// Do thing 1
publish(25); // 25% done
// Do thing 2
publish(50); // 50% done
// Do thing 3
publish(75); // 75% done
// Do thing 4
return true;
}
protected void process(List<Integer> chunks) {
for (Integer i : chunks)
progressBar.setValue(i);
}
protected void done() {
try {
boolean b = get();
if (b)
progressBar.setValue(100); // 100% done
else
// Notify the user processing failed
}
catch (InterruptedException ex) {
// Notify the user processing was interrupted
}
catch (ExecutionException ex) {
// Notify the user processing raised an exception
}
}
};
Добавление:
Это можно распространить на несколько задач, просто нужно изменить подход к настройке индикатора выполнения. Вот что приходит на ум:
Иметь массив счетчиков завершения, по одному на задачу.
int[] completions = new int[numTasks];
Arrays.fill(completions,0);
Запустите SwingWorkers, каждому из которых был присвоен индексный номер. Затем методы process
или done
вызывают что-то вроде этого, чтобы обновить общий индикатор выполнения.
void update(int index, int percComplete) {
completions[index] = percComplete;
int total = 0;
for(int comp: completions)
total += comp/numTasks;
overallPB.setValue(total);
}
При желании можно отобразить JProgressBar для каждой задачи.
Приложение 2:
Если задачи различаются по времени выполнения (например, попадание в кэш или пропуск в кэш), вы можете исследовать ProgressMonitor . Это диалоговое окно хода выполнения, которое отображается только в том случае, если задача занимает больше времени (настраивается, по умолчанию 500 мс).