1

如何添加 Oracle 的 ADF 的 selectOneChoice 的选项卡索引?

4

1 回答 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 回答