2009-12-22 49 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}" /> 

希望這給了新的見解。

相關問題