連載
» 2006年09月23日 00時00分 公開

Swingのスレッド処理を理解するSwingでJavaに強くなる(6)(2/2 ページ)

[島浩文,株式会社シンプレクス・テクノロジー]
前のページへ 1|2       

 では前ページで紹介したコードで、どのような機能を実現しているのかを説明していきましょう。

ToDo編集機能の実装(ModifyActionHandler)

 ModifyActionHandlerクラスは、編集ボタンのイベントに対する処理を担当するインナークラスです。「toDoListModel. set(int index, Object target);」にて、toDoListModelのindex番目のデータ、targetを設定することができます。

ToDo削除機能の実装(RemoveActionHandler)

 RemoveActionHandlerクラスは、削除ボタンのイベントに対する処理を担当するインナークラスです。「setButtonsEnabled(false)」にて、すべてのボタンを非活性化し、その後doLongTaskにて、10秒待ちます(10秒待つ理由は後述します)。

 その後、「toDoListModel.remove(int index);」にて、toDoListModelのindex番目のデータを削除します。削除した後、「setButtonsEnabled(true)」にて、すべてのボタンを活性化します。

ToDo選択行反映機能の実装(TodoListSelectionHandler)

 TodoListSelectionHandlerクラスは、ToDoリストで選択した行の内容をテキストフィールドに反映します。

イベントディスパッチスレッドとは?

 さて、削除処理にあえて10秒間待つ処理を入れました。もし単純にこれを処理してしまうと、削除処理中は何も操作できなくなってしまいます。これでは、アプリケーションを使う側は削除を行うたびにいらいらしてしまいます。このような事態を避けるために、時間のかかる処理を別のスレッドに任せて、ユーザーが操作を行えるようにしながらバックグラウンドで処理を行うということをします。

 ここでは、RemoveThreadクラス内で別スレッドを呼び出し、時間のかかる処理(doLongTask)と削除処理を実行させることによって実現しています。

 時間のかかる処理を行った後、最後にSwingUtilities.invokeLater()を呼び出しています。これは、「toDoListModel.remove(int index);」および「setButtonsEnabled(true)」の2つの処理をイベントディスパッチスレッドで実行させるために使っています。なぜ、わざわざこのようなことをするのでしょうか?

 Swingのスレッドポリシーとして、次のようなものがあります。

 「コンポーネントの「状態に依存する」あるいは「状態に影響を与える」
「処理はすべてイベントディスパッチスレッド上で動作しなければならない」

 これはいい換えると、Swingの描画に関連する処理は、シングルスレッドで処理しなくてはならないということです。そして、そのシングルスレッドがイベントディスパッチスレッドなのです。このルールにのっとるため、わざわざSwingUtilities.invokeLater()を使っているのです。

 今回の実装でも、sleepは描画に関係がないため別スレッドを生成して実行させましたが、描画に関する処理(toDoListModel.remove、setButtonsEnabled)はイベントディスパッチスレッドで実行させるようにしています。

SwingAppMainクラス

SwingUtilities.invokeLater

 「SwingAppMain」クラスのmainメソッド内ではSwingUtilities.invokeLater を呼び出し、Frameを描画する処理をイベントディスパッチスレッドに実行させています。mainメソッドのスレッドが描画しているわけではありません。

SwingUtilities. isEventDispatchThread

 「SwingAppMain」クラスのmainメソッドとcreateAndShowTodoListメソッドでは、SwingUtilities.isEventDispatchThreadというメソッドが呼び出されています。これは、実行されているスレッドがイベントディスパッチスレッドであればtureを、別のスレッドであればfalseを返します。

 「SwingAppMain」を実行すると、コンソールに以下のように表示されます。

main : false
createAndShowTodoList : true

 createAndShorTodoListメソッドは、イベントディスパッチスレッド上で実行されていることが分かりますね。

まとめ

 本連載では計6回にわたってSwingの基本を解説してきました。

  1. Frame、Panelなどコンポーネントの扱い方
  2. イベント処理の仕方
  3. スレッドのポリシー

 簡単なGUIアプリケーションだけならこれで作成できるようになりましたが、GUIの世界はもっと広く、深いものです。これを機に、GUIアプリケーションの世界に踏み込み、GUIの面白さに触れていただければ幸いです。

前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。