ADF Faces Tableについて

ADF Faces Tableコンポーネントのtableタグを使用して作成する表は、JSFのdataTableタグを使用して作成する表に類似しており、次の追加機能があります。

dataTableと同様に、ADF Facesのtableには、列を子要素として挿入する必要があります。ADF Faces Tableでは、ADF Facesのcolumnタグを使用します。詳細は、「ADF Facesの列について」を参照してください。

これらの各追加機能および2つの表の違いは、次の各項で説明します。JSFのdataTableタグの詳細は、「データ表について」を参照してください。

ADF Facesのtableタグの詳細は、「ADF Faces開発者ガイド」を参照してください。

ADF FacesのtableとJSFのdataTableの違い

標準のJSF表と同様に、ADF Faces Tableは各行のデータの列タグを処理する間にデータ収集を繰り返します。ただし、ADF Faces Tableには、ADF Facesの列タグ(af:column)を使用する必要があります。表はoracle.adf.view.faces.model.CollectionModelを使用してデータにアクセスします。したがって、ADF Faces Tableの値属性は、該当するモデルのインスタンスであるマネージドBeanまたは次のいずれかにバインドできます。

CollectionModel以外のモデルの場合、表では、インスタンスが自動的にCollectionModelに変換されます。

ADF Facesのtableの追加機能

範囲操作

大きいデータ・セットに表がバインドされ、表の行すべてを1度に表示しないようにする場合は、rows属性を設定して、リクエストごとに表示する行数を設定できます。設定後のADF Faces Tableでは、ユーザーが行の範囲(次または前)を選択できるナビゲーション・リンクが提供されます。コレクション・サイズ合計がわかっている場合は、コレクション内の特定範囲セットに直接移動できるコントロールが、次のように表示されます。

ナビゲーション・リンクとドロップダウンを備えた表

このコントロールを表示するには、ADF Faces TableコンポーネントにビルトインされているSelectRangeChoiceBarコンポーネントを使用します。範囲操作を無効にする(および1ページにすべての行を表示する)には、row属性を0に設定します。

範囲を設定するには、rows属性とfirst属性を併用します。first属性は表示する現在の範囲を決定します。この属性は、リスト内の各行の索引(ゼロから開始)です。各範囲はfirstで識別された行から開始し、rows属性に指定された行数のみが範囲に含まれます。最初は、first属性がゼロにデフォルト設定され、第1行目が上部にある状態で範囲が表示されます。

ユーザーが(「前へ」「次へ」などのナビゲーション・リンクの1つを選択して)別の範囲に移動すると、表ではRangeChangeEventが生成されます。このイベントには、範囲の先頭になる行の索引が挿入されます。表では、first属性の値を新しい索引に変更することで、このイベントに応答します。first属性の値は、ユーザーがページを離れると保存されません。たとえば、従業員名がリンクとして表示される表を作成したとします。ユーザーは、リンクをクリックして従業員の詳細情報を表示する別のページに移動できます。ユーザーが最初に範囲を変更(したがってfirst属性も変化)して、従業員名のリンクをクリック(別のページに移動)すると、元の表ではfirst属性が0(ゼロ)に設定されて表示されます。つまり、ユーザーが従業員リンクをクリックした範囲ではなく、最初の範囲が表示されます。

RangeChangeEventにはリスナーが関連付けられています。表のRangeChangeListener属性は、マネージドBeanのメソッドにバインドできます。その後このメソッドはRangeChangeEventに応じて(つまり、ユーザーによる表の範囲変更によってfirst属性が変化する都度)起動されます。これは、ユーザー・ナビゲーションに対応してなんらかのアクションを実行する必要がある場合(前の範囲用に作成したキャッシュ・データをリリースする必要がある場合など)に便利です。

行の詳細

ユーザー・アクションに基づいて表示または非表示にできるデータを挿入するには、表でdetailStampファセットを使用します。表示または非表示にするデータにバインドされるこのファセットに、コンポーネントを挿入します。表には、「詳細」というラベルの列が追加され、アクティブ化してコンポーネントにバインドされたデータを表示できるトグルが表示されます。このトグルが非アクティブ化されると、次の図のようにデータは非表示になります。

「詳細」列が開いている表

トグルがアクティブ化されると、次の図のようにデータが第2の行に表示されます。

詳細の状態(表示または非表示)を示すアイコン

表のallDetailsEnabled 属性をTrueに設定すると、次の図のように、すべての行の詳細を表示または非表示にできるリンクが表示されます。

ノードが開いてすべての詳細が表示されている表

ユーザーが行の詳細を表示または非表示にすると、表ではDisclosureEvent(または表のallDetailsEnabled属性がTrueに設定されている場合はDisclosureAllEvent)が生成されます。これによって、詳細のトグル(開く/閉じる)が表に指示されます。DisclosureEventにはリスナーが関連付けられています。表のDisclosureListener属性は、マネージドBeanのメソッドにバインドできます。その後、DisclosureEventに応じてこのメソッドが起動され、必要な後処理が実行されます。

選択

selectionファセットを使用すると、1番左側に列を挿入できます。ユーザーは、この列で、1つ以上の行を選択し、それらの行に対してアクションを実行できます。このファセットで<af:tableSelectOne>タグを使用し、ユーザーが単一の行を選択できるラジオ・ボタン表示列を指定します。ユーザーが1つ以上の行を選択できるチェックボックス表示列を指定するには、<af:tableSelectMany>タグを使用します。また、tableSelectManyタグを使用すると、ユーザーが行のすべてを選択したり、選択をすべて解除できるリンクが表示されます。

両方のタグにはtext属性があります。この属性の値にはユーザーへの説明を指定できます。これらのタグには、通常、ActionSourceが子コンポーネントとして使用され、選択した行に対してアクションを実行するために使用されます。たとえば、選択した行をユーザーが削除または更新できるように、tableSelectManyタグ内にcommandButtonタグを挿入できます。

ユーザーが選択してボタンをクリックすると、tableSelectOneまたはtableSelectManyコンポーネントは、そのボタンに関連付けられているActionListenerをコールする前に、表のgetSelectionState()をコールすることで取得したRowKeySetを更新します。tableSelectOneの場合は、現在の行がActionListenerの起動前に選択されているため、対応する処理を行のデータに提供するマネージドBeanのメソッドに、commandButtonActionListenerをバインドできます。tableSelectMany場合、ActionListenerは、表のgetSelectionState().getRowKeyIterator()をコールすることで、選択されたrowKeysを取得します。tableSelectOneタグと同様に、commandButtonActionListener属性は、行のデータに必要な処理を提供するマネージドBeanのメソッドにバインドします。

tableSelectOneコンポーネントとtableSelectManyコンポーネントはいずれも表の選択状態が変化したときにSelectionEventをトリガーします。SelectionEventは、選択された行または選択が解除された行をレポートします。表のSelectionEventListener属性は、マネージドBeanのメソッドにバインドできます。このメソッドは、SelectionEventに応じて起動され、必要な後処理を実行します。

required属性は、tableSelectOneおよびtableSelectManyの両方のコンポーネントに設定できます。これによって、ユーザーが行を選択しなかった場合にエラーがスローされます。ただし、required属性を設定した場合は、必須入力を示すエラー・メッセージを正しく表示するために、表のsummary属性も設定する必要があります。

tableSelectOneおよびtableSelectManyコンポーネントには、autoSubmit属性も設定できます。trueに設定すると、ユーザーが選択を実行したときに、表が格納されているフォームが自動的に発行されます。詳細は、「自動発行およびADF Faces入力コンポーネントについて」を参照してください。

次の図に、ユーザーが1つ以上の部門を選択した後で、削除または更新できる表を示します。

ユーザーが行を選択できる「選択」列のチェックボックス

次に、JSFページのファセットに対応するコードを示します。

<f:facet name="selection">
<af:tableSelectMany text="Select a department and press the Delete to remove the departement or press Update to edit the department "> <af:commandButton text="Delete" actionListener="#{mybean.deleteDept}"/> <af:commandButton text="Update" actionListener="#{mybean.updateDept}"/> </af:tableSelectMany>
</f:facet>

次に、mybeanマネージドBeanのdeleteDeptメソッドに対応するコードを示します。

public void deleteDept(ActionEvent action)
{ 
UIXTable table = getTable();
Iterator selection = table.getSelectionState().getRowKeyIterator();
String oldKey = table.getRowKey();
while(selection.hasNext())
{
String rowKey = (String) selection.next();
table.setRowKey(rowKey);
MyRowImpl row = (MyRowImpl) table.getRowData();
row.markForDeletion();
}
// restore the old key:
table.setRowKey(oldKey);
}
// Binding methods for access to the table.
public void setTable(UIXTable table) { _table = table;}
public UIXTable getTable() {return _table;}
private UIXTable _table;

このコードはtableSelectOneコンポーネントに対しても機能しますが、イテレータで戻されるのは多くても常に1行です。

また、ADFデータ・バインディングは、<af:tableSelectMany>タグをサポートしません。詳細は、「Oracle ADFスタート・ガイド」を参照してください。

ソート

ADF Faces Tableコンポーネントは、行のソートをサポートしています。ただし、基礎となるCollectionModelでは、次のメソッドを実装している必要があります。

public boolean isSortable(String propertyName)
public List getSortCriteria()
public void setSortCriteria(List criteria)

基礎となるモデルがCollectionModelでない場合、表ではjava.lang.Comparableを実装するプロパティのデータが調査されます。これは、小さいデータ・セットには十分でも、CollectionModelにソート機能を直接挿入するほどの効果はありません。

ユーザーが列をソートすると、表コンポーネントではSortEventが生成されます。このイベントには、列のソート基準を戻すgetSortCriteria()プロパティがあります。表では、基礎となるCollectionModelsetSortCriteriaメソッドをコールすることで、このイベントに応答します。登録されているSortListenerインスタンスもコールされます。

ソート可能な列の構成方法は、「ADF Facesの列について」を参照してください。

バンド

表の行や列に背景色の代替網掛けを適用するには、バンドを使用します。banding属性はrowcolumnまたはnoneに設定できます。bandingInterval属性は、同じ背景色を共有する連続した行や列の数を決定します。表に対するこれらのバンド属性は、bandingShade属性を列に対して設定した場合は無視されます。詳細は、「ADF Facesの列について」を参照してください。


ADF Faces Tableの作成および編集
ADF Faces Tableでの列の使用
データ表内のファセットの使用
ADF Faces Coreライブラリ - <af:table>タグ