SwingのEvent Dispatch ThreadとGriffonのedt

2019-07-26Griffon, Groovy

今更ながら、Griffon登場後にSwingの本やサイトを見ては勉強しています。

Event Dispatch Thread?

Swingでボタン押下後の処理などを書きたい場合には、Swing GUIを管理しているスレッドとは別のスレッドを起動して実行する必要がある。
このGUIを管理しているスレッドを Event Dispatch Thread って呼ぶらしい。

このスレッド内で重たい処理を実行させると、処理完了までに以下のような問題が発生する。

  • GUIのリサイズできない
  • GUIの移動できない
  • コントロールに入力したりフォーカス合わせたりできない

「Swingっていけてないじゃん、重たいじゃん」と勘違いしてしまう。つい最近そんなことをしてしまっていた。

別スレッドを生成して実行させても、その処理を実行後にまた EDT に制御を戻して描画を行ったり・・・めんどいきがする。

Griffonのedtメソッド、doOutsideメソッド

そこで GroovyGriffon フレームワークが生きてくる。

コントローラクラス内では

  • edt
  • doOutsite

の二つのメソッドが使用できる。こいつらにクロージャーを渡すことで、edt、doOutsideブロック内に記述した処理はそれぞれ Event Dispatch Thread の処理、あるいは別スレッドの処理として実行させることができる。

def search = { event ->
    // ボタンを使用不可に
    model.searchEnbled = false

    // 別スレッド処理
    doOutside {
        // 検索処理
        // ...

        // ボタンを使用可能に
        edt {
            model.searchEnabled = true
        }
    }
}

最初 Griffon のサイトの説明読んだときにはさっぱりだったけど、 Swing について勉強していってようやくわかってきた。

今更だけど少しずつ Swing の仕組みがわかってきた。

2019-07-26Griffon, Groovy