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