ADF Facesのツリー表について

オブジェクトの階層を、そのオブジェクトのデータの列とともに表示するには、ADF Facesのツリー表コンポーネント<af:treeTable>を使用します。ADF Faces Tableと同様に、ツリー表にはADF Facesの列が子要素としてあり、ADF Facesのおよびコンポーネントにあるすべての機能をサポートしています。たとえば、ツリー表コンポーネントを使用すると、次のツリー表のように、マネージャとその部下をすぐ下にリストして、従業員名、部門、役職および入社日を表示できます。

マネージャと従業員のツリーを表示したツリー表

ADF Facesのツリー表に指定できるのは単一のルートのみですが、各要素には任意の数の子要素を指定できます。前述の表では、1人のルート・マネージャのみが表示されていることに注意してください。ただし、このコンポーネントには、ユーザーが前後のルートを選択できるナビゲーション・メカニズムが組み込まれます。複数のルートを1度に表示する必要がある場合は、ADF Facesのツリー・コンポーネントの使用を検討してください。

このコンポーネントには、次の機能も含まれています。

ADF Facesのツリーと同様に、ツリー表コンポーネントは、oracle.adf.view.faces.model.TreeModelを使用してモデルにアクセスします。このクラスは、ADF Faces Tableコンポーネントがデータにアクセスする際に使用するTreeModelを拡張します。TreeModelの詳細は、「ADF Faces開発者ガイド」またはADF FacesのJavadocを参照してください。

オブジェクト名の列のレンダリングには、nodeStampファセットが使用されます。この列には、階層内の要素の主要な識別子(前述の例では、マネージャと従業員の名前)が表示されます。各要素にコンポーネントを作成するかわりに、このnodeStampは、ADF Faces Tableコンポーネントに対して行がレンダリングされるように、繰り返しレンダリングされます。var属性は、現在のノードへのアクセスを提供します。前述の例では、次のコード・サンプルのように、nodeを変数として使用することで、従業員の部門の表示に使用するoutputTextコンポーネント・タグは、#{node.Deptno}を値として使用できます。

<af:treeTable value="#{employees}" var="node">
  <f:facet name="nodeStamp">
    <af:column sortable="false">
      <f:facet name="header">
        <h:outputText value="Employee"/>
      </f:facet>
      <af:outputText value="#{node.Ename}"/>
   </af:column>
  </f:facet>
   <af:column sortable="false" formatType="number">
     <f:facet name="header">
        <h:outputText value="Dept. No"/>
     </f:facet>
     <h:outputText value="#{node.Deptno}"/>
   </afcolumn>
</af:treeTable>    

フォーカス

ツリー表には、オブジェクト名の列に加え、フォーカス・アイコンをレンダリングする列も指定できます。これらのアイコンを使用して、ユーザーは、ツリー表の特定のサブツリーをズーム・インまたはズーム・アウトできます。この列はpathStampファセットがレンダリングし、さらに、表の上にパス・リンクもレンダリングします(pathStampファセットが削除されると、列とリンクも削除されます)。ツリー表のfocusPathプロパティは、現在フォーカスがある要素を判断します。次の図は前述と同様の表で、Blakeの行でフォーカス・アイコンをクリックした後の様子を示しています。

ユーザーがKingをクリックして表を当初の表示に戻すパスが、表の上に表示されていることに注意してください。

ユーザーがフォーカスを変更すると、表ではFocusEventが生成されます。ユーザーがフォーカスを変更する先の要素は、イベントが配信される前に現行のノードとなります。それに応じて、ツリー表ではfocusPathプロパティが変更されます。ツリー上のFocusListener属性は、マネージドBeanのメソッドにバインドできます。その後このメソッドはFocusEventに応答して(つまり、ユーザーがフォーカスを変更する都度)起動されます。

ノードの開閉

ユーザーがノードを開く(または閉じる)と、DisclosureEventが送信されます。このイベントのisExpandedメソッドは、ユーザーによるノードの操作(開いているか、閉じているか)を判断します。DiscolsureEventにはリスナーが関連付けられています。ツリー表のDisclosureListener属性は、マネージドBeanのメソッドにバインドできます。その後このメソッドはDisclosreEventに応答して(つまり、ユーザーがノードを開閉する都度)起動されます。

ツリー表には「すべて開く」および「すべて閉じる」リンクもあります。ユーザーがいずれかのリンクをクリックすると、DisclosureAllEventが送信されます。このイベントのisExpandAllメソッドは、ユーザーによるノードの操作(すべてを開いているか、閉じているか)を判断します。この判断に従って、表では、現在フォーカスがあるルート・ノードの子ノードを開きます(または閉じます)。大規模なツリーでは、すべてを開くコマンドによって、すぐ下の子要素以外のノードが開くことはありません。

ADF Facesツリー表コンポーネントは、oracle.adf.view.faces.model.PathSetクラスのインスタンスを使用して、開かれた要素を判断します。このインスタンスは、コンポーネントのtreeState属性として格納されます。このインスタンスを使用すると、階層内での要素の開閉状態をプログラムによって制御できます。PathSetインスタンスによって格納された要素は、開いていると判断されます。他のすべての要素は閉じられます。このクラスは、addAll()およびremoveAll()と同様の操作もサポートします。

範囲操作

ADF Faces Tableコンポーネントと同様に、ツリー表コンポーネントも範囲操作を提供します。ただし、ツリー表では、rows属性ではなく、rowsByDepth属性が使用されます。この属性の値には、負でない数値をスペースで区切ったリストが指定されます。各数値は、ツリーの深さの範囲サイズを定義します。最初はツリーのルート・ノード数で、最後はツリーのリーフ要素数になります。ツリーの実際の深さがリストのサイズより大きい場合は、残りのブランチのリストにある最後の数が使用されます。0(ゼロ)を使用すると、すべてのデータが表示されます。

たとえば、次の図は、rowsByDepthプロパティが0 0 3に設定された表を示しています。この図では、すべてのルート・ノード(ただし、ツリー表では1つのみ)が表示され、ルートのすぐ下の子ノードもすべて表示されます。しかし、その後は各ブランチごとに3ノードのみが表示されます。ツリー表コンポーネントには、他のノードに移動するリンクが挿入されていることに注意してください。


ADF Facesツリー表の作成および編集
ADF Faces Coreライブラリ - <af:treeTable>タグ