2009-12-22 26 views

回答

4

不幸的是,你不能在标准的JSF级别上控制它。至少,不是标准组件和渲染器。指定的tabindex将应用于所有生成的元素(我不需要ADF,但我想它是单选按钮)。

您可以考虑覆盖与af:selectOneChoice关联的渲染器,以便它接受一个附加属性tabindexes或接受逗号分隔的索引字符串,并将其应用于随后生成的单选按钮上。

您需要查阅有问题的组件的ADF文档,以确定它属于哪个组件系列以及它正在使用哪个渲染器。一旦发现,你基本上需要创建一个类,它会覆盖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}" /> 

希望这给了新的见解。

相关问题