イベントディスパッチ上でswingのコンポーネントはさわろう。
2007/12/05
java
swing
javaです。swingです。
ネットワーク越しからデータを取得する場合、Threadをおこして、データをとってきたりすると思います。
その際に、このThreadから直接Swingのコンポーネントを操作すると、期待してない動きをする可能性があります。
この現象は、プログラムの動作がうまくいっている場合は、気がつきませんが、ある程度プログラムが完成しはじめて、発覚すると、追いかけづらいことになります。
イベントディスパッチ上からの呼び出しかどうか判定するのは
javax.swing.SwingUtilities.isEventDispatchThread()を使います。
現在のスレッドが AWT イベントディスパッチスレッドの場合に true を返します。
イベントディスパッチ上でなければ、下記のコードでくるんで実行します。
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// ここでswingの部品を触る。
}
});
public void run() {
// ここでswingの部品を触る。
}
});
invokeLaterのjavadocでの説明です。
doRun.run() を、AWT イベントディスパッチスレッドで非同期的に実行させます。これは、保留中のすべての AWT イベントが処理されたあとに発生します。このメソッドは、アプリケーションスレッドが GUI を更新する必要があるときに使用されます。....
このUI関係のコードは、頭をこんがらせますね。
何故そうしなければいけないのか、考えないと...
ところで、
javadocからチュートリアルのリンクもあるので、手元のjavadocを確認することが大切。
javaプログラマで、javadocへの参照を怠っている人は、いますぐ手元にダウンロードしませう。eclipseのコードアシストを山カンで使っている人は、あやういです。
: