Swingコンポーネントを使ってGUIを作成する場合でもそうなのですが、 一般に、表示されている画面コンポーネントの内容を書き換えるのには 注意が必要です。
AWTを含めたSwingの各種コンポーネントやSWTのコンポーネント等、GUI部品は、 通常は単一のスレッド(Event-Handling Thread)が描画を行うことを前提として 設計されています。しかし画面コンポーネントに対してはキー操作を始めとして 複数の独立したイベントが非同期に発生しますので、これらのイベントを 一端イベント処理キューに入れ、単一のスレッドがこれらのイベントを順に 処理するようにして、描画が正しく行われることを保証しようとします。
こんな時、別のスレッド、例えばネットワークからのメッセージ受信などを トリガとしたスレッドが画面コンポーネントに描画を行った場合、イベント処理 スレッドの画面処理とぶつかってしまい、表示が正しくできない、あるいは デッドロックに陥るといった問題が発生します。
こうした問題を避けるには、画面コンポーネントへの描画を行っている イベント処理スレッド以外のスレッドで画面コンポーネントへの描画を行いたい 場合、イベント処理スレッドに対して処理を渡す、つまりイベント処理キューに 入れてやる必要があります。
Swingではjavax.swing.SwingUtilitiesというユーティリティクラスの invokeLater()メソッドを使って、画面コンポーネントへの描画処理を イベント処理キューに入れることができます。
public static void javax.swing.SwingUtilities#invokeLater(Runnable doRun);
イベント処理スレッドは、その時点でキューに溜まっている処理をした後に、引数で
指定されたdoRunというRunnableオブジェクトのrun()メソッドを呼び出します。
従って、別スレッドから行いたかった描画処理を、このrun()メソッド内に記述
すればよいのです。