Причина этого заключается в том, что метод выполняется в потоке диспетчеризации событий, и любые операции перерисовки также будут выполняться в этом потоке .Одним из «решений» является обновление индекса вкладки, а затем планирование оставшейся работы для последующего вызова в EDT;это должно привести к немедленному обновлению состояния вкладки;например,
public void actionPerformed(ActionEvent evt) {
tab.setSelectedIndex(1);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// Do remaining work.
}
});
}
РЕДАКТИРОВАТЬ
В приведенном ниже комментариях пример вызова SwingWorker
для вызова метода runProgram будет выглядеть примерно так:
// Typed using Void because runProgram() has no return value.
new SwingWorker<Void, Void>() {
protectedVoid doInBackground() {
runProgram();
return null; // runProgram() doesn't return anything so return null.
}
protected void done() {
// Called on the EDT when the background computation has completed.
// Could insert code to update UI here.
}
}.execute()
Однако я чувствую здесь большую проблему: тот факт, что вы видите значительную задержку в обновлении вкладки, заставляет меня думать, что вы выполняете долгосрочные вычисления на EDT.Если это так, вы должны рассмотреть возможность выполнения этой работы в фоновом потоке.Взгляните на класс SwingWorker
.