>>977
Swing はシングルスレッドで実装されてて、
イベントディスパッチスレッドってところでイベント処理してる。
その Action をボタンに addActionListener すると
actionPerformed() の処理が終わるまで描画がブロックされて、
5秒過ぎてから今までブロックされてた描画イベント
(0秒、1秒・・・4秒と表示する)がまとめて起きる。

for (int i = 5; i >= 0; i--) {
 new Runnable(){
  public void run(){
   // i秒待つ処理。
   // Action があるスレッドとは別スレッドで動くので Action をブロックしない。

   SwingUtilities.invokeLater(new Runnable(){
    public void run(){
     // ラベルを "i秒" にする処理
    }
   });
  }
 }.start();
}

動くかどうか試してないけど、こんな感じに書くことになるはず。
イベントディスパッチスレッドやSwingUtilitiesでググると
詳しい解説とか拾えると思われ。