JClientはJavaクラスで構成されるフレームワークで、ビジネス・コンポーネント用のデータ・バインドされたJavaのUIアプリケーションを短期間で効率的に構築できます。JClientフレームワークは、クライアントとビジネス・コンポーネント間の通信を処理するヘルパー・クラスで構成されています。
ヒント: データ・バインドされたUIクライアントをJavaで作成する場合は、JClient、Swing、およびBusiness Components for Java(BC4J)を使用してください。このトピックでは、データ・バインドされたクライアントUIを実装する際に必要な、設計時に使用するJDeveloperのツールおよびAPIについて、わかりやすく説明します。
JClientアーキテクチャは、Model-View-Controller(MVC)デザイン・パターンに基づいています。MVCでは、コンポーネントごとに論理的に分けられた、次の3つの通信オブジェクトがあります。
たとえば、定義済のモデル、ビュー、およびコントローラを含むSwingコンポーネントJCheckBoxが存在するとします。ユーザーがチェックボックスをクリックしてコントローラと対話すると、コントローラは状態を変更するようモデルに通知します(falseからtrueへ、またはその逆)。モデルの状態の変更をリスニングしているビューは、変更に応じて自身を更新します(たとえば、チェックボックスを選択した状態で表示)。このアーキテクチャの重要な点は、ビューまたはそれを表示しているビューと、更新に使用するコントローラのいずれも、モデルでは認識されないという点です。
Swing APIでは、各コンポーネントに対し、それぞれのmodelプロパティ、場合によってはdocumentプロパティを使用してモデルを設定します。Swingでは、JTextComponentのサブクラスに対するモデルはドキュメントと呼ばれ、setDocument()
メソッドおよびgetDocument()
メソッドを使用してアクセスします。標準のSwing JLabelコンポーネントはデータを表さないため、MVCアーキテクチャには基づいていません。ただし、JClientではJULabelコンポーネントを提供しているため、ビジネス・コンポーネントのデータを使用してラベルを割り当てる際に、この制限に対処することができます。
このトピックは、Business Components for Javaフレームワークについて説明するものではありません。ただし、JClientを介してSwingコントロールをビジネス・コンポーネントにバインドするには、最低限の知識が必要です。BC4Jの詳細を理解するには、理解の必要な内容に関するトピックを参照してください。
JClientを介してUIに表示されるデータは、ビジネス・コンポーネントのビュー・オブジェクトによって生成される行セットから取得されます。したがって、JDeveloperで設計時にJClientを使用するためには、ワークスペースに、次の情報が格納されたコンテナ(パッケージ)を定義するビジネス・コンポーネント・プロジェクトが必要です。
また、JDeveloperで設計時に使用するためには、クライアント・アプリケーションで使用する名前付きインスタンスも、ビジネス・コンポーネント・プロジェクトで指定する必要があります。これらの名前付きインスタンスは、「アプリケーション・モジュール」ダイアログの「データ・モデル」タグでビジネス・コンポーネントのデータ・モデルを変更して指定します。ビジネス・コンポーネント・プロジェクトのデータ・モデルは、クライアントからアクセス可能な名前付きインスタンスまたは使用方法を定義します。つまり、JClientフォームのコントロールにバインドできるビュー・オブジェクトの使用方法について、階層または関係を指定します。
次に示す「アプリケーション・モジュール」ダイアログの「データ・モデル」タグの画面の2つの図は、それぞれパッケージ内の使用可能なビュー・オブジェクト定義のリストと、アプリケーション・モジュールのデータ・モデルが定義するビュー・オブジェクト・インスタンスのリストを示しています。
上の図では、3つのビュー定義と2つのビュー・リンク定義が示されています。たとえば、ビュー・リンク(OrdersViewDefinition
経由)OrdersCustomerIdFkLink
は、CustomersViewDefinition
を使用可能なリンク元ビューとして、OrdersViewDefinition
を使用可能なリンク先ビューとして定義しています。
上の図では、3つのビュー定義の5通りの使用方法を含む、アプリケーション・モジュールのデータ・モデルが示されています。たとえば、OrderItemsViewUsage
はOrdersItemViewDefinition
のインスタンスで、OrderItemsDetailViewUsage
はOrderItemsViewDefinition
のもう1つのインスタンスです。これら2つのビューの使用方法の違いは、行セットのスコープにあります。ディテール・ビューの使用方法の行セットは、OrdersMasterViewUsage
の現在の行によって決まるのに対し、OrderItemsViewUsage
は、マスター・ビュー・オブジェクトへのビュー・リンクがないため無制限です。
JClientのUIのモデルに対応するデータ・モデルは、「アプリケーション・モジュール」ダイアログの「データ・モデル」タグに表示されているビュー・インスタンスとビュー・リンク・インスタンスの組合せによって定義されます。たとえば、アプリケーションで、ビュー・オブジェクトを動的に変更するためにBC4Jのビュー・オブジェクトを取得する場合は、SwingまたはJClientのAPIではなく、BC4JのAPIを使用します。
アプリケーションとビジネス・コンポーネント間の通信は、JClientのAPIを使用して、次のような方法で行われます。
これがJClientのレイヤーでどのように行われるかを、典型的なJClientのコードを例に説明します。次のコードは、JClientフォーム・ウィザードを使用して完全なアプリケーション・コードを生成する場合に表示されるコードと同じです。
たとえば、生成されたフレームで、ビジネス・コンポーネントに接続するコードが次のようになっているとします。
JUApplication app = JUMetaObjectManager.createApplicationObject("Project1.Mypackage1Module", null, new JUEnvInfoProvider());
このコードにより、名前付きアプリケーション・モジュール定義Mypackage1Module
がプロジェクト・ファイルProject1.cpx
で検索され、ビジネス・コンポーネントのアプリケーション・モジュールへの接続が確立されます。
SwingコントロールでUIを配置するパネルに、次のJClientのコンストラクタが、ビュー・オブジェクトの行にアクセスするためのInteratorBindingに対してコンテナ・オブジェクトを作成します。
private JUPanelBinding panelBinding = new JUPanelBinding("Project12.Mypackage9Module", this);
データ・バインドされたコントロールを管理するレベルに応じて、フレームまたはパネルのレベルでJUPanelBindingオブジェクトを作成できます。
次に、setApplication()
メソッドで、ビジネス・コンポーネントへのどの接続をJUPanelBindingで使用するかを定義します。
panelBinding.setApplication(app);
executeIfNeeded()
メソッドで、問合せ実行ポリシーを提供します。
panelBinding.executeIfNeeded();
最後に、createAttributeBinding()
メソッドでバインドを作成し、特定のSwingコンポーネントおよびモデル(JClient固有のコンポーネントの場合)に対するリスナーとして登録します。
mCustomerId.setDocument(JUTextFieldBinding.createAttributeBinding(panelBinding, mCustomerId, "CustomersView", null, "CustomersViewIter", "CustomerId"));
メソッドにより、このコンポーネントの現在のモデルが返されます。この意味では、JClientはモデルを提供するのではなく、単にバインドしているヘルパー・クラスでコントロールを登録するために「model(またはdocument)」プロパティを使用するだけと考えられます。
JClientが独自のモデルを提供する例外が2つあります。
JTableまたはJTreeに独自のモデルを提供したい場合は、JUTableBindingおよびJUTreeBindingのソース・コードを調べ、これらのバインドを上書きする方法を決定してください。
それ以外のコンポーネントに独自のモデルを提供したい場合は、BC4Jのバインドが実行される前にプログラムでsetDocument(myModel)
メソッドまたはsetModel(myModel)
メソッドを実行してください。実行しない場合、BC4Jのバインドでアクティブなモデルに対するリスナーが登録されません。
Swing、BC4J、およびJClientのAPIの使用例を、次にいくつか示します。
追加したメソッドをコールするため、またはビュー・オブジェクトを動的に変更するためにビジネス・コンポーネントのビュー・オブジェクトを取得する必要がある場合は、次のバインドを使用してビュー・オブジェクト・インスタンスを取得します。
ViewObject vo = panelBinding.findIterBinding("DeptViewUsageIter").getViewObject();
Swingを使用してクライアント側の検証をハードコードする場合は、次の追加機能をJClientのバインドとともに使用します。
mDeptno.getDocument().addDocumentListener(myDocumentListener);
コンポーネント自体の動作を変更するには、Swingコンポーネントのサブクラスを作成します。このコンポーネントでもJClientのバインドを使用できます。
JTextField mDeptno = new JTextField()
{
public boolean isFocusTraversable() {return false;}
};
なんらかの理由により、JClientアプリケーションをビジネス・コンポーネント・アプリケーション・モジュールから切断する場合は、次のようにコールします。
// JUApplication app = ....
app.getApplicationModule().getTransaction().disconnect();
ただし、JUApplicationオブジェクトを切断する場合は、JUIバインドを含むJClientコントロールをすべて使用不可にする必要があります。そうしないと、アプリケーションでNullPointerExceptionがスローされます。JClientコントロールを使用不可にするには、次のメソッドを使用します。
myControl.setEnabled(false);
JClientフォームの設計について
生成されるJClientコードについて
Swingコントロール用JClientモデルについて
JClientのホワイト・ペーパーは、次のOracle Technology Network(OTN)のWebサイトから利用できます。
http://otn.oracle.com/products/jdev/htdocs/JClient/SimpleJClient.html
Oracle Formsからの移行に役立つJClientの概要も、次のOracle Technology Network(OTN)のWebサイトから利用できます。
http://otn.oracle.com/products/jdev/htdocs/JClient/forms_Client.html
ビジネス・コンポーネントの詳細は、次のトピックを参照してください。
ビュー・オブジェクト、ビュー・リンク、アプリケーション・モジュールおよびクライアントの使用
MVCの詳細は、次のjava.sun.comのWebページを参照してください。
http://java.sun.com/products/jfc/tsc/articles/getting_started/getting_started2.html