Как добавить индекс вкладки selectOneChoice из ADF Oracle? - PullRequest
1 голос
/ 22 декабря 2009

Как добавить индекс вкладки selectOneChoice для АПД Oracle?

1 Ответ

4 голосов
/ 23 декабря 2009

К сожалению, вы не можете управлять им на стандартном уровне 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}" />

Надеюсь, это даст новое понимание.

...