如何添加 Oracle 的 ADF 的 selectOneChoice 的选项卡索引?
问问题
2630 次
1 回答
4
不幸的是,您无法在标准 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}" />
希望这能提供新的见解。
于 2009-12-22T23:55:59.287 回答