2011-12-03 5 views
1

私はADFフェースで新しく、af:selectOneChoiceの値変更に対してpartialTrigger a:panelAccordionの問題に直面しています。 af:panelAccordionには、af:showDetailItem内に複数のaf:showDetailHeaderが含まれています。 af:showDetailItemとそのaf:showDetailHeaderはすべて動的に生成されます。 豆の大学は、ビューの範囲内にあり、そのコードは以下のとおりである:af:panelAccordion partialtrigger on af:selectOneChoice valueChangeListener

public class College { 
    private List<Department> departments; 
    private List<SelectItem> departmentDropDownMenu; 
    private String selectedDepartment; 

    public College() { 
     this.departments = new ArrayList<Department>(0); 

     Employee employee1 = new Employee("Employee 1", "Information"); 
     Employee employee2 = new Employee("Employee 2", "Information"); 
     Employee employee3 = new Employee("Employee 3", "Information"); 
     Employee employee4 = new Employee("Employee 4", "Information"); 
     Employee employee5 = new Employee("Employee 5", "Information"); 

     List<Employee> employees1 = new ArrayList<Employee>(0); 
     employees1.add(employee1); 

     List<Employee> employees2 = new ArrayList<Employee>(0); 
     employees2.add(employee2); 

     List<Employee> employees3 = new ArrayList<Employee>(0); 
     employees3.add(employee3); 

     List<Employee> employees4 = new ArrayList<Employee>(0); 
     employees4.add(employee4); 
     employees4.add(employee5); 

     Department department1 = new Department("Department 1", employees1); 
     Department department2 = new Department("Department 2", employees2); 
     Department department3 = new Department("Department 3", employees3); 
     Department department4 = new Department("Department 4", employees4); 

     this.departments.add(department1); 
     this.departments.add(department2); 
     this.departments.add(department3); 
     this.departments.add(department4); 

     List<SelectItem> departmentDropDownMenu = new ArrayList<SelectItem>(0); 
     departmentDropDownMenu.add(new SelectItem("Department 1")); 
     departmentDropDownMenu.add(new SelectItem("Department 2")); 
     departmentDropDownMenu.add(new SelectItem("Department 3")); 
     departmentDropDownMenu.add(new SelectItem("Department 4")); 

     this.setDepartmentDropDownMenu(departmentDropDownMenu); 
     this.setSelectedDepartment("Department 1"); 
    } 

    public void departmentDropDrownValueChangeListener(ValueChangeEvent event) { 
     String oldValue = event.getOldValue().toString(); 
     String newValue = event.getNewValue().toString(); 

     if(oldValue.equalsIgnoreCase(newValue)) { 
      return; 
     } 
     List<Department> departmentUpdated = new ArrayList<Department>(0); 

     for (Department department : departments) { 
      if(department.getDepartmentName().equals(newValue)) { 
       departmentUpdated.add(department); 
       break; 
      } 
     } 

     for (Department department : departments) { 
      if(!department.getDepartmentName().equals(newValue)) { 
       departmentUpdated.add(department);     
      } 
     } 

     this.setDepartments(departmentUpdated); 
    } 

    public void setDepartments(List<Department> departments) { 
     this.departments = departments; 
    } 

    public List<Department> getDepartments() { 
     return departments; 
    } 

    public void setDepartmentDropDownMenu(List<SelectItem> departmentDropDownMenu) { 
     this.departmentDropDownMenu = departmentDropDownMenu; 
    } 

    public List<SelectItem> getDepartmentDropDownMenu() { 
     return departmentDropDownMenu; 
    } 

    public void setSelectedDepartment(String selectedDepartment) { 
     this.selectedDepartment = selectedDepartment; 
    } 

    public String getSelectedDepartment() { 
     return selectedDepartment; 
    } 
} 

部門と従業員クラスは、単純なPOJOです。 Departmentクラスには、次の2つのフィールドのみが含まれています。 1. departmentNameの文字列と 2.従業員クラスにはアクセサーも含まれています。 1. Employeeクラスには2つのフィールドがあります。1.文字列名と 2.文字列情報。

ページのJSPXコードを以下に示す:

<?xml version='1.0' encoding='UTF-8'?> 
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1" xmlns:f="http://java.sun.com/jsf/core" 
      xmlns:af="http://xmlns.oracle.com/adf/faces/rich"> 
    <jsp:directive.page contentType="text/html;charset=UTF-8"/> 
    <f:view> 
     <af:document title="Page.jspx" id="d1"> 
      <af:form id="f1"> 
       <af:panelStretchLayout id="psl1"> 
        <f:facet name="center"> 
         <af:panelGroupLayout id="pgl2"> 
          <af:selectOneChoice label="Department" value="#{college.selectedDepartment}" id="soc1" 
               unselectedLabel="" autoSubmit="true" immediate="true" 
               valueChangeListener="#{college.departmentDropDrownValueChangeListener}"> 
           <f:selectItems value="#{college.departmentDropDownMenu}" id="si1"/> 
          </af:selectOneChoice> 
          <af:panelAccordion id="pa1" discloseNone="true" partialTriggers="soc1" discloseMany="true"> 
           <af:forEach items="#{college.departments}" var="department"> 
            <af:showDetailItem text="#{department.departmentName}" id="sdi1"> 
             <af:forEach items="#{department.employees}" var="employee"> 
              <af:showDetailHeader text="#{employee.name}" disclosed="false" id="sdh1"> 
               <af:outputText value="#{employee.info}" id="ot1"/> 
              </af:showDetailHeader> 
             </af:forEach> 
            </af:showDetailItem> 
           </af:forEach> 
          </af:panelAccordion> 
         </af:panelGroupLayout> 
        </f:facet> 
       </af:panelStretchLayout> 
      </af:form> 
     </af:document> 
    </f:view> 
</jsp:root> 

私は何をしたいAFを再配置することです:のselectOneChoice:のshowDetailItemは、AFの選択した値によって異なります。

私は画像の問題点を示す午前: Image 1 Image 2

あなたが最初のイメージは、ページのロード後に正常な状態である見ることができるように。部門1は従業員1つだけです。従業員1と部門4には従業員1、従業員2の2人の従業員がいます。部門4をドロップダウンから選択すると、部門3が最後のポジションに入りますが、部門3のパネルには2つのaf:showDetailItem元々は従業員が1人しかいません。また、余分なaf:showDetailItemはクリックできません。

いずれかの提案があれば、それは私にとって非常に役に立ちます。

ありがとうございます。

答えて

1

問題は<af:forEach/>を使用していることです。 tag documentationによると:<af:forEach>タグの項目で

オブジェクトは、追加、削除、またはコンポーネントツリーが

を 作成されたらあなたは代わりに<af:iterator/>タグを使用することができ、再注文するべきではありません。 JDevは<af:panelAccordion/>の有効な子ではないと訴えますが、動作します。

このページレイアウトは機能しているようです。注:<af:selectOneChoice/>をトップファセットに移動し、<af:panelGroupLayout/>をダンプして、アコーディオンを伸ばしてすべての子を表示させるようにしました。

<?xml version='1.0' encoding='UTF-8'?> 
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1" xmlns:f="http://java.sun.com/jsf/core" 
      xmlns:af="http://xmlns.oracle.com/adf/faces/rich"> 
    <jsp:directive.page contentType="text/html;charset=UTF-8"/> 
    <f:view> 
     <af:document title="Page.jspx" id="d1"> 
      <af:form id="f1"> 
       <af:panelStretchLayout id="psl1"> 
        <f:facet name="center"> 
          <af:panelAccordion id="pa1" discloseNone="false" partialTriggers="soc1" discloseMany="true" reorder="enable"> 
           <af:iterator value="#{college.departments}" var="department"> 
            <af:showDetailItem text="#{department.departmentName}" id="sdi1"> 
             <af:iterator value="#{department.employees}" var="employee"> 
              <af:showDetailHeader text="#{employee.name}" disclosed="false" id="sdh1"> 
               <af:outputText value="#{employee.info}" id="ot1"/> 
              </af:showDetailHeader> 
             </af:iterator> 
            </af:showDetailItem> 
           </af:iterator> 
          </af:panelAccordion>  
        </f:facet> 
        <f:facet name="top"> 
         <af:selectOneChoice label="Department" value="#{college.selectedDepartment}" id="soc1" unselectedLabel="" autoSubmit="true" 
              valueChangeListener="#{college.departmentDropDrownValueChangeListener}" immediate="true"> 
          <f:selectItems value="#{college.departmentDropDownMenu}" id="si1"/> 
         </af:selectOneChoice> 
        </f:facet> 
       </af:panelStretchLayout> 
      </af:form> 
     </af:document> 
    </f:view> 
</jsp:root> 

これが役立ちます。 ADFの混乱を歓迎します。 :)

関連する問題