如何添加Oracle ADF的selectOneChoice的tab索引?
答案 0 :(得分:4)
不幸的是,您无法在标准JSF级别控制它。至少,不是标准组件和渲染器。指定的tabindex
将应用于所有生成的元素(我不是ADF,但我猜它是单选按钮)。
您可以考虑覆盖与af:selectOneChoice
关联的渲染器,以便它接受一个addidional属性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}" />
希望这会给出新的见解。