2009-12-22 3 views

답변

4

아쉽게도 표준 JSF 수준에서는 제어 할 수 없습니다. 적어도 표준 구성 요소 및 렌더러에는 포함되지 않습니다. 지정된 tabindex에 모두 개의 요소가 생성됩니다 (ADF는 아니지만 라디오 버튼이라고 생각합니다).

af:selectOneChoice과 연결된 렌더러를 오버라이드하여 addidional 속성 tabindexes을 사용하여 인덱스의 commaseparated 문자열을 받아 들인 다음 생성 된 라디오 버튼에 적용 할 수 있습니다.

해당 구성 요소가 속한 구성 요소 패밀리 및 사용중인 렌더러를 확인하려면 해당 구성 요소의 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에서 사용자 정의 렌더러를 선언하면

을 다음과 같이 당신이 얻을 수 있도록

<af:selectOneChoice .... > 
    <f:attribute name="tabindexes" value="1,3,5,7,2,4,6,8" /> 

당신은 심지어 일부 EL을 넣을 수 있습니다 다음과 같이

<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 속성을 사용할 수 있습니다 그것은 bean 프라퍼티로부터 (생성 된) 문자열이다.

<af:selectOneChoice .... > 
    <f:attribute name="tabindexes" value="#{bean.tabindexes}" /> 

희망 사항은 새로운 통찰력을 제공합니다.

관련 문제