如何添加Oracle ADF的selectOneChoice的tab索引?

时间:2009-12-22 20:49:58

标签: java jsp jsf oracle-adf

如何添加Oracle ADF的selectOneChoice的tab索引?

1 个答案:

答案 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}" />

希望这会给出新的见解。