torutkのブログ

ソフトウェア・エンジニアのブログ

SwingWorker

JSR-296 Swing Application FrameworkのTaskを使ったサンプルを作成する際に、TaskのベースとなっているSwingWorkerの使い方を調べました。よい解説を探したところ、以下の記事を見つけました。
Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle

Event Dispatch Threadを停止させてはいけないこと、そのためのSwingWorkerの使い方が詳しく解説されています。

記事の読書メモ
  • 記事で紹介しているサンプルは、Flickrへアクセスし画像の一覧を取得し画面に表示するもの
  • Swingのスレッドの基本を解説(初期化スレッド、イベントディスパッチスレッド(EDT)、ワーカースレッド)
  • mainメソッド(初期化スレッド)で可視化(setVisible)してはいけない
  • 別スレッドからSwing APIにアクセスする方法(invokeLater)
    • EDTの中でinvokeAndWaitは呼ばないこと
  • 30ms以上の処理はEDT上で実行しない。SwingWorkerを使ってワーカースレッドで実行する
  • SwingWorkerは、RunnableとFutureを実装する抽象クラス
  • アプリケーション開発者は最低限doInBackgroundメソッドを実装(オーバーライド)すればよい→ワーカースレッドで実行される
  • doInBackgroundメソッドが終了すると、EDT上でdoneメソッドが呼ばれるので、doneメソッドを実装(オーバーライド)してGUIを更新するとよい。doInBackgroundメソッドの処理結果はgetメソッドで取得する(Futureインタフェース)
  • progressプロパティは0〜100の整数値を保持、Beans仕様なので変更通知に対応(PropertyChangeListener)
    • JProgressBarをJFrameに貼っておき、SwingWorkerのprogressプロパティの変更通知をPropertyChangeListener実装クラスを定義して受け取り、JProgressBarを更新すると、処理の進捗状況を逐次表示するアプリケーションができる
  • 処理の途中結果を随時取り出す仕組みとしてpublish/processメソッドがある