То, что происходит, состоит в том, что 3-секундный код выполняется в потоке GUI, поэтому у кнопки нет шанса обновить, пока это не будет сделано.
Чтобы решить эту проблему, запустите SwingWorker
для выполнения длительной операции; тогда вы по-прежнему можете делать что-то в графическом интерфейсе, пока вы ждете этого.
Вот пара из обучающих программ по предмету, и у SwingWorker
Javadocs, упомянутых выше, также есть некоторый код.
Пример кода
public void actionPerformed(ActionEvent e) {
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
@Override
public Void doInBackground() {
// Call complicated code here
return null;
// If you want to return something other than null, change
// the generic type to something other than Void.
// This method's return value will be available via get() once the
// operation has completed.
}
@Override
protected void done() {
// get() would be available here if you want to use it
myButton.setText("Done working");
}
};
myButton.setText("Working...");
worker.execute();
}