SwingのEvent Dispatch ThreadとGriffonのedt
今更ながら、Griffon登場後にSwingの本やサイトを見ては勉強しています。
- Swing EDT(Event Dispatch Thread)関係おさらい - Groove Tube
- またEDTにやられる… - Groove Tube
- Swingとスレッドと再描画 - Kazzzの日記
Event Dispatch Thread?
Swingでボタン押下後の処理などを書きたい場合には、Swing GUIを管理しているスレッドとは別のスレッドを起動して実行する必要がある。
このGUIを管理しているスレッドを Event Dispatch Thread って呼ぶらしい。
このスレッド内で重たい処理を実行させると、処理完了までに以下のような問題が発生する。
- GUIのリサイズできない
- GUIの移動できない
- コントロールに入力したりフォーカス合わせたりできない
「Swingっていけてないじゃん、重たいじゃん」と勘違いしてしまう。つい最近そんなことをしてしまっていた。
別スレッドを生成して実行させても、その処理を実行後にまた EDT に制御を戻して描画を行ったり・・・めんどいきがする。
Griffonのedtメソッド、doOutsideメソッド
そこで Groovy の Griffon フレームワークが生きてくる。
コントローラクラス内では
- edt
- doOutsite
の二つのメソッドが使用できる。こいつらにクロージャーを渡すことで、edt、doOutsideブロック内に記述した処理はそれぞれ Event Dispatch Thread の処理、あるいは別スレッドの処理として実行させることができる。
def search = { event ->
// ボタンを使用不可に
model.searchEnbled = false
// 別スレッド処理
doOutside {
// 検索処理
// ...
// ボタンを使用可能に
edt {
model.searchEnabled = true
}
}
}
最初 Griffon のサイトの説明読んだときにはさっぱりだったけど、 Swing について勉強していってようやくわかってきた。
今更だけど少しずつ Swing の仕組みがわかってきた。
ディスカッション
コメント一覧
まだ、コメントがありません