У вас классическая проблема с параллелизмом и 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.