Oracle の ADF の selectOneChoice のタブ インデックスを追加するにはどうすればよいですか?
1 に答える
残念ながら、標準の JSF レベルでは制御できません。少なくとも、標準のコンポーネントとレンダラーではそうではありません。指定されたものは、生成されたすべてのtabindex
要素に適用されます (私は ADF を使用していませんが、ラジオ ボタンだと思います)。
に関連付けられたレンダラーをオーバーライドしてaf:selectOneChoice
、追加の属性を取得するtabindexes
か、インデックスのカンマ区切りの文字列を受け入れて、後で生成されたラジオボタンにそれらを適用することを検討できます。
問題のコンポーネントの ADF ドキュメントを参照して、そのコンポーネントが属するコンポーネント ファミリと使用しているレンダラーを確認する必要があります。見つけたら、基本的にメソッドextends
をオーバーライドするクラスを作成する必要がありますrenderOption()
(少なくとも、JSF標準com.sun.faces.renderkit.html_basic.RadioRenderer
クラスでは正確にその名前で呼び出されます)。基本的に、メソッド ロジックをコピーして (ADF については不明ですが、基本的な JSF 実装はオープン ソースです)、次のロジックを追加する必要があります。
String tabindexes = (String) component.getAttributes().get("tabindexes");
if (tabindexes != null) {
String[] tabindexItems = tabindexes.split("\\s*,\\s*");
String indexKey = component.getClientId(context) + "_currentTabIndex";
Integer index = (Integer) component.getAttributes().get(indexKey);
if (index == null || index == tabindexItems.length) {
index = 0; // Note this thus restarts at 0 if there are more selectitems than tabindexes. Just to be on the safe side.
}
String tabindex = tabindexItems[index];
component.getAttributes().put(indexKey, ++index); // We need to save it for the next generated input element.
writer.writeAttribute("tabindex", tabindex, "tabindex");
}
faces-config.xml
次のようにカスタムレンダラーを宣言すると
<render-kit>
<renderer>
<component-family>put here the component family of af:selectOneChoice</component-family>
<renderer-type>put here the renderer type of af:selectOneChoice</renderer-type>
<renderer-class>com.example.YourCustomRadioRenderer</renderer-class>
</renderer>
</render-kit>
tabindexes
次に、追加の属性を次のように使用できます。
<af:selectOneChoice .... >
<f:attribute name="tabindexes" value="1,3,5,7,2,4,6,8" />
EL を入れて、Bean プロパティから (生成された) 文字列として取得することもできます。
<af:selectOneChoice .... >
<f:attribute name="tabindexes" value="#{bean.tabindexes}" />
これが新しい洞察をもたらすことを願っています。