Java:Swing処理の実装方法。

職場で後輩に教えたことの備忘録だけど、後々役立つかもしれないからこっちにも保存。

権利云々は…大丈夫だと思うけど、この程度なら。書いたのあたしだし、文面考えたのもあたしだし。特定業務のネタも…入ってないな、よし。

なお…。あたし個人の方針として定義したパターンなので、明らかな間違い以外は突っ込み無用デス。

1. 基礎知識
1.1 Swingについて

  1. Swingに関わる処理はスレッドセーフではない。
  2. Swingは、Swingに関わる処理を行うためのスレッドを1本だけ持っている。
  3. Swingスレッド以外のスレッドからSwingに関わる処理を実行するためには、Swingスレッドに処理内容を伝達する必要がある。
  4. Swingスレッド以外のスレッドからは、Swingスレッド内でどの処理を実行しているか(ある処理が終わったか否か)を知ることはできない。
  5. Swingスレッドは1本しかないので、スレッド内で長時間処理を行うと、その間GUIは更新されずにフリーズし、白抜き画面などになってしまう。

1.2 スレッド、Runnableについて

  1. Runnableは「run()メソッドを持つ」ことを定義するインタフェース。
  2. スレッドはRunnableインタフェース実装クラスの1種。      「run()メソッドに書かれた処理を、他のスレッドとは独立した時間軸で実行する」
  3. スレッドの開始は、start()メソッドで行う。start()の実行によってスレッドはJava VMに対し、実行権を要求する。      直接run()を実行しても、スレッドにはならない。
  4. Java VMが実行権を与えたタイミングで、スレッドのrun()が実際に実行される。

2. Swing GUI処理の実装基本パターン
2.1 お約束

  1. Swingに関わらない処理は、基本的にSwingから独立したスレッドとして実装する。

2.2 基本パターン

  1. -- Swingイベントスレッド内 --
  2. Swingイベントの発生(ボタンのActionPerformed()呼び出しなど)。
  3. 処理に必要なデータをGUIから取得(選択されているデータ、入力文字列等)。
  4. 処理スレッドのインスタンス生成、必要データのセット。
  5. GUIのロック(全ボタンを使用不能にする、等)。
  6. 処理スレッドの開始、Swingイベントの終了。
  7. -- 以下、処理スレッド内 --
  8. 処理の実行(DBアクセス、計算等)。
  9. GUI更新Runnableのインスタンス生成、GUI更新データのセット。
  10. GUI更新RunnableインスタンスをSwingUtilities.invokeLater()を使用してSwingイベント待ち行列に追加。
  11. ループ処理の場合、8)~10)を繰り返す。
  12. (全処理終了後)GUIのロック解除Runnableのインスタンス生成、       SwingUtilities.invokeLater()を使用してSwingイベント待ち行列に追加。
  13. 処理スレッドの終了。
  14. -- 以下、再びSwingイベントスレッド --
  15. 10)で追加されたRunnableを順番に実行。
  16. 12)で追加されたRunnableを実行、GUIロック解除。
  17. 全終了。

トラックバック

http://www.magicalrabbit.jp/MT42/mt-tb.cgi/313

コメントを書く

コメント機能は現在調整中DEATH。

最近の記事


カテゴリ一覧