シリーズJavaの画面表示のつづきです。
Javaの画面作成方法として、AWT,Swing,SWTを今までやってきました。
そして、それを通して、これらは、大体同じ方法できるということを示しました。
今回は、それらの画面表示における、共通的な方法と相違点、さらにBREWまでも含めた共通点について、考えてみたいと思います。
■画面作成における共通の考え方
JAVAアプリで行う画面出力、すなわちAWT,Swing,SWTを使って、とくに、複数画面を表示する場合は、大きく、
(1)アプリ全体のクラス
(2)各画面のクラス
の2つに分かれます(BREWでも、同様な区別をします)
このとき、各画面間のデータを読み書きするため、
(3)(画面間)共通領域
を作成します(これを、このブログでは、カオル姫方式と呼んでいます)
共通領域はJavaでは、ハッシュマップを使います
(BREWは、IKHMapというものを作りました)
■アプリ全体について
アプリ全体のクラスでは、以下のようなメソッドを作成しました。
(1-1)アプリを起動するメソッド
・共通領域を生成する
・初期画面を呼び出す
→Javaでは、main,BREWではアプリ_initAppData
また、今回は作りませんでしたが、
場合によっては(BREWの場合は必須)
(1-2)アプリ終了メソッド
→BREWではアプリ_freeAppData
を作成することもあります。
さらに、今回は触れませんでしたが、複数画面の場合は、
(1-3)複数画面間のリンク関係
を処理するメソッドも必要な場合があります(*注として、後述)
そして、これは、BREWだけなのですが
(1-4)アプリのイベント処理メソッド
・各画面のイベント処理メソッドを呼び出す
→BREWではアプリ_HandleEvent
→Javaでは、システムがやることなので「ない」
というのがあります。
■各画面について
各画面には、以下の4ないし5種類のクラスが必要です
(2-1)画面初期表示メソッド
・ウィンドウを作成する
・画面部品を作成し、ウィンドウに付ける
・再描画処理を呼ぶ
(2-2)イベント処理メソッド(群)
・各イベントごとに以下の処理
(2-2-1)画面入力値をチェックして共通領域へ
(2-2-2)モデルの処理を呼び出し
→モデルは共通領域の値を元に処理
共通領域に結果設定
(2-2-3)再描画処理
(2-2-3-1)現在画面の再描画
・再描画処理呼び出し
(2-2-3-2)次画面へ
・現在画面を消す必要があれば
現在画面の終了処理メソッド
・単一画面の場合は、次画面の初期化
・複数画面のとき、
表示していたら、次画面の再表示
表示してなければ次画面の初期化
(2-3)終了処理メソッド
・ウィンドウを終了
・メモリ解放など
(2-4)再描画処理
・共通領域から値をセット
・再表示して、フォーカス設定
(2-5)(フォーカス移動の必要があれば)
次カーソル移動項目決定
今回の例では、Javaの場合、
(2-1)コンストラクタ&initAppData
(2-2)内部クラスの各メソッド
(2-3)freeAppData
(2-4)DispAppData
(2-5)カーソル移動はどーでもいいので「なし」
また、BREWの場合は
(2-1)各画面_initAppData
(2-2)各画面_HandleEvent
(2-3)各画面_freeAppData
(2-4)各画面_DispAppData
(2-5)各画面_NextCurItem
となります。
つまり、各クラス、メソッドについては、AWTでもSWTでもSwingでも同じようにして
作ることが可能で、違いは
・ウィンドウの作り方(フレームを呼ぶか、Display,Shellとくるかなど)
・部品とウィンドウの結びつき
・イベント処理の継承対象や、メソッド名
といった、細かい部分の書き方程度の違いということになります。
そして、BREWにおいてすら、この考え方は同じような感じです
→なので今やってる、BREWのソース自動生成をちょっといじると、
Javaのソース自動生成ができます。
むしろ、これらと、サーブレット、Strutsのほうが、考え方は大きく違います。
といったかんじです。
*注:複数画面間のリンク関係
ユーザーごとに、第一画面と第二画面を提供するという場合、
この第一画面は、どの第二画面とつながっているか?
といった判断が必要になります。
これを処理するのが、「複数画面間のリンク関係」メソッドです。
具体的には、全画面に、一意になるような、画面IDをふります。
そして、画面生成や、画面間の関係を付け替えたいとき、上記関数を呼んで、
共通領域とリンク元の画面ID,画面の種類、リンク先の画面ID,画面の種類
を引数として渡すと、共通変数に
キー:リンク元の画面ID_リンク先の画面の種類
値 :リンク先の画面ID
と、
キー:リンク先の画面ID_リンク元の画面の種類
値 :リンク元の画面ID
の2種類のデータをいれます。
これによって、共通領域で、自分の画面(の画面Dは分かるから)の、次の画面は
すでに表示されているか、表示されているとすればそのIDは?というのは
自分の画面ID_次の画面の種類
を共通領域から探せば分かる
(帰ってきたIDが、その対象画面、NULLなら、その画面はない)
というものです。
画面を消去するときは、関係がなくなるので、それらを削除するメソッドも必要に
なり、ちとめんどうです。