JavaClientは 、アプリケーション作成が容易になるようにJavaSwing をベースに拡張したものを提供しています。
そのため、Swing GUI部品にて提供されているAPIはそのまま使用できるのが特徴です。
このドキュメントでは どの部分が拡張されたもので、標準のSwingの動作差異が発生しているのかの説明になります。
JavaClientでは、処理部品(ロジッククラス)を設定できる イベント を提供しています。
Before(フォーカス取得時) 、After(フォーカス紛失前) というタイミングにて、処理部品を挿し込みします。
これら標準提供しているイベントのタイミングでは、
処理の順番がシーケンスで必ず発生する という仕様にて 作成・制御 されています。
(言葉を変えると、Before の発生と After の発生順序が逆にならないように、また入れ子で動作しないように 制御されています。)
また、定義された処理を実行するスレッドは Swingメインスレッド上 になります。
これにより、Afterのタイミングにて フォーカス移動は不可 という指定をすると、Tabやマウスクリックでフォーカス移動しようとしても
フォーカスは移動できない(クリックは反応しない) 制御を実現しています。
時間のかかる処理 (たとえば サーバアクセスなど) 中も、続けてGUIの操作(描画処理を含む)を有効にしたい場合には、 処理自体を別スレッドにて処理を行う方法のご検討をお願いします。
処理中 の MOUSE_PRESSED のイベントは 無視されます。
これは、Swingの EventQueueでは処理中 の MOUSE_PRESS(ボタン押す),MOUSE_RELEASE(ボタン離す) の イベントが EventQueueに溜まった場合、
同時に KEYイベントが溜まっているている状態では イベント発火順番が 実行した順番と異った順番になります。
これが原因での問題が発生しないように 製品にて制御しています。
標準提供しているイベントのタイミング以外でのハンドリングでは、通常のSwingのコーディングと同じように GUIコンポーネント部品に
対して add***Lisnter により イベントをリスナーする事が可能です。
ただし、その場合では JavaClientエンジンでは 上記の制御を行わないのに注意してください。
(つまり、処理順番が正しく実行されるとは限らない)
フォーカス移動の動作についても実行エンジンにて制御を行っています。
処理中での フォーカス移動(Component#requestFocus() など) が発生しても無視され、
処理終了後、適切なGUIコンポーネントにフォーカスが移るように実行エンジンにて制御されます。
処理中での フォーカス移動(Component#requestFocus() など) の処理は Swingからの実行、ロジッククラス からの実行
ともに 無視されますので ご注意ください。
ロジッククラス から フォーカス移動先を指定する場合には SetFocus (標準ロジッククラス、メソッド) をお使いください。
適切なGUIコンポーネントとは、
項目チェックエラー発生時 は フォーカス移動なし、
処理中に "フォーカス移動指示" があった場合には 指示のコンポーネント、
無い場合には クリックされた(MouseClick) もしくは 次のコンポーネント(TabKey) になります。
このように、最小限のフォーカス移動に押さえることにより、無駄なフォーカスイベントを発生しない (=無駄な Before,After の実行を行わない) ように制御されています。
JavaClientでは、処理部品を作成し各種イベントに設定することにより動作いたします。
どのような処理を、どのような部品にて作成すると一番好ましいのか? という観点にてご説明します。
処理種類として、"処理時間が少ないもの" と "処理時間がかかるもの" が存在すると思います。
後者の "処理時間がかかるもの" の例としては サーバーとアクセスしてデータを送受信 するのようなものになります。
"処理時間がかかるもの"の処理は、基本的に ボタンコンポーネント の Afterイベント に設定するのをお勧めします。
テキストのAfter などのフォーカス紛失前 のタイミングの場合、操作者にとってそのタイミングにて処理が入っているかどうかの認識
が出来ないため、処理中の状態が 「フリーズした?」と思われる事も発生します。
逆にボタンのAfterに "処理時間がかかるもの" を設定すれば、「このボタンを押下されたときに何かの処理が走る」
ということが認識できるため、操作者にとって より親切な インターフェースになります。
アプリケーションを作成するに当たって、テスト方法を "始めに確立" しておく事はとても重要です。
VisualFrameの場合、以下のように大きく分けることが出来ます。
Javaのコーディングが発生するのは、ロジッククラス のみになりますので、「単体テスト」完了にて ハードコーディング部分 のテストが完了になります。
「全体テスト」では、ツールにて設定した定義が正しいかどうかのテストになります。
ロジッククラス では 入出力のインターフェースが固定で統一されていますので、JUnit によるテスト自動化 なども容易に行う事ができます。
(Developer'sWorksにて サンプルを提供しています。)
実行すると、指定されたデスクトップ(画面メニュー)が表示されます。
デスクトップのメニューより、Client Application Management Consoleにて定義した フレーム(Window) が表示します。
(デスクトップにはメニューの他に初期表示の設定、定義情報事前ロードなどの機能があります。)
フレームには、アイテムと呼ばれる データ と コンポーネント 保持しているオブジェクトが存在します。
ロジッククラスへの入出力引数は、このアイテムを受け渡ししますので、ロジッククラスからは データ情報 と GUIコンポーネント情報 の両方が取得・設定可能です。
内部データをロジッククラスより変更した場合、自動的にGUIコンポーネントに反映されるため、開発時には "データの状態"のみ意識することになります。
GUIでの表示の際、フォーマットクラスを指定することができます。
日付の場合パターン"yyyy/MM/dd"を指定することにより「20010101」→「2001/01/01」、数値の場合パターン"0.###E0 m/s"を指定することにより
「20000」→「2E4 m/s」と表示形式をフォーマットします。入力する際には元の形式にアンフォーマットします。
この フォーマット機能を実行しても内部データは影響しません。つまり、フォーマットされるのはGUIコンポーネント上の表示のみになります。
データ型毎に IMEの自動設定、文字水平位置の自動設定が行われます。
データ型毎に データチェック方法 の指定が可能です。
標準チェック内容は、Data Management Consoleの内容(長さ、型 など)に基づいたチェックをおこないますが、独自でチェッククラスを作成して登録する事も可能です。
チェックはフォーカス紛失時に動作し、チェックエラーの場合には メッセージダイアログ表示 + フォーカス移動不可状態 になります。
上記イメージの該当部分のリンクより各説明が表示されますので、詳しくはそちらをご覧下さい。
事前にロジッククラスの作成・登録、基本データ定義 などを行っておきます。
画面イメージ作成は、製品付属のGUIデザイナを使用する事で簡単に行うことが出来ます。
その他画面定義では、データの設定、データとコンポーネントとの紐付け作業、イベント時実行モジュールの設定などを行います。
FrameRunner の 画面単体テスト用 FrameRunner を使い、画面の動作テストを行います。
実行、デバッグ、定義情報再設定を繰り返しながら完成していきます。デバッグには、使用データ一覧表示や、ロジッククラスの実行ログなど参照が可能です。
上記イメージの該当部分のリンクより各説明が表示されますので、詳しくはそちらをご覧下さい。