プログラマメモ2 - programmer no memo2

イベントディスパッチ上でswingのコンポーネントはさわろう。 2007/12/05

javaです。swingです。

ネットワーク越しからデータを取得する場合、Threadをおこして、データをとってきたりすると思います。
その際に、このThreadから直接Swingのコンポーネントを操作すると、期待してない動きをする可能性があります。
この現象は、プログラムの動作がうまくいっている場合は、気がつきませんが、ある程度プログラムが完成しはじめて、発覚すると、追いかけづらいことになります。

イベントディスパッチ上からの呼び出しかどうか判定するのは
javax.swing.SwingUtilities.isEventDispatchThread()を使います。

現在のスレッドが AWT イベントディスパッチスレッドの場合に true を返します。


イベントディスパッチ上でなければ、下記のコードでくるんで実行します。

SwingUtilities.invokeLater(new Runnable() {
public void run() {
// ここでswingの部品を触る。
}
});


invokeLaterのjavadocでの説明です。

doRun.run() を、AWT イベントディスパッチスレッドで非同期的に実行させます。これは、保留中のすべての AWT イベントが処理されたあとに発生します。このメソッドは、アプリケーションスレッドが GUI を更新する必要があるときに使用されます。....


このUI関係のコードは、頭をこんがらせますね。
何故そうしなければいけないのか、考えないと...

ところで、
javadocからチュートリアルのリンクもあるので、手元のjavadocを確認することが大切。
javaプログラマで、javadocへの参照を怠っている人は、いますぐ手元にダウンロードしませう。eclipseのコードアシストを山カンで使っている人は、あやういです。

: