2012-04-02 4 views
2

Ich habe meinen Code vollständig geändert. Aber aktiver Index zeigt immer noch Probleme. Manchmal wird es aufgerufen und manchmal nicht. Was stimmt mit dem folgenden xhtml-Code nicht?Primefaces tabview aktiven Index funktioniert nicht richtig

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:p="http://primefaces.org/ui" > 
    <h:head> 
     <title>Admin Panel</title> 

     <style type="text/css"> 
      .ui-accordion .ui-accordion-content{ 
       background-color: #eedae3; 
      } 
      .ui-accordion .ui-accordion-header { 
       height: 30px; 
       background-color: #e74f54; 
      } 
      .ui-tabs .ui-tabs-nav li{ 
       background-color: #6f97df; 
       height: 35px; 
      } 
      .datatable{ 
       background-color: #eedae3; 
      } 
     </style> 

    </h:head> 
    <h:body> 
     <p:tabView id="tabView" activeIndex="#{profileInfoManagedBean.myCurrentTab}" > 
      <p:ajax event="tabChange" listener="#{profileInfoManagedBean.tabIsChangedKana}" /> 


      <p:tab id="locationInfoTab" title="Location Info"> 

       <h:form id="form1"> 
        <p:growl showDetail="true" /> 

        <p:panel header="New Country"> 
         <h:panelGrid columns="3" cellpadding="5" cellspacing="5"> 

          <p:column> 
           <h:outputLabel for="country" value="Country: "></h:outputLabel> 
          </p:column> 
          <p:column> 
           <p:inputText id="country" value="#{profileInfoManagedBean.country.country}" required="true" label="City"> 

            <f:validateLength minimum="5" maximum="20" /> 
            <p:ajax event="blur" update="msg1"></p:ajax> 
           </p:inputText> 
          </p:column> 
          <p:column> 
           <p:message id="msg1" for="country" display="icon"></p:message> 
          </p:column> 

         </h:panelGrid> 
         <p:commandButton type="submit" action="#{profileInfoManagedBean.addCountry}" value="Save" ajax="true" ></p:commandButton> 
        </p:panel> 

       </h:form> 
       <p:separator /> 

       <h:form id="countryDataTableForm"> 
        <p:panel> 
         <p:growl id="messagesww" /> 
         <p:confirmDialog id="confirmDialog" message="Are you sure you want to delete the selected row ?" 
             header="Deleting Row" severity="alert" widgetVar="confirmation1"> 
          <p:commandButton id="confirm" value="Yes Sure" update="messagesww" oncomplete="confirmation1.hide()" 
              action="#{profileInfoManagedBean.deleteObject}" /> 
          <p:commandButton id="decline" value="Not Yet" onclick="confirmation1.hide()" type="button" /> 
         </p:confirmDialog> 

         <p:dataTable style="width: 700px;" var="coun" value="#{profileInfoManagedBean.countryList}" selection="#{profileInfoManagedBean.deletingObj}" rowKey="#{coun.countryId}" 
            paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
            paginator="true" rows="5" rowsPerPageTemplate="10,15,20,25" editable="true"> 
          <p:ajax event="rowEdit" update="@this" 
            listener="#{profileInfoManagedBean.onEditRow}" /> 


          <p:column headerText="Country"> 
           <p:cellEditor> 
            <f:facet name="output"> 
             <h:outputText value="#{coun.country}" /> 
            </f:facet> 
            <f:facet name="input"> 
             <p:inputText value="#{coun.country}" style="width:100%" /> 
            </f:facet> 
           </p:cellEditor> 
          </p:column> 

          <p:column id="inactive" filterBy="#{coun.isActive}" 
             headerText="isActive" footerText="exact" 
             filterOptions="#{profileInfoManagedBean.isActiveDropDown}" 
             filterMatchMode="exact"> 

           <p:cellEditor> 
            <f:facet name="output"> 
             <h:outputText value="#{coun.isActive}"></h:outputText> 
            </f:facet> 
            <f:facet name="input"> 
             <h:selectOneMenu value="#{coun.isActive}" > 
              <f:selectItem itemLabel="True" itemValue="true" /> 
              <f:selectItem itemLabel="False" itemValue="false" /> 
             </h:selectOneMenu> 
            </f:facet> 
           </p:cellEditor> 
          </p:column> 

          <p:column headerText="Edit"> 
           <p:rowEditor /> 
          </p:column> 

          <p:column headerText="Delete"> 

           <p:commandButton type="button" onclick="confirmation1.show()" 
               id="delCountry" title="Delete Country" icon="ui-icon ui-icon-trash" /> 
          </p:column> 

          <p:column selectionMode="single"> 
           <f:facet name="header"> 
            <h:outputText value="select" /> 
           </f:facet> 
          </p:column> 


         </p:dataTable> 
        </p:panel> 

       </h:form> 

      </p:tab> 






      <p:tab id="basicInfoTab" title="Basic info"> 
       <p:accordionPanel id="aPanel1"> 
        <p:tab id="tab2" title="basic info"> 
         <h:form id="dkk"> 
          This is basic info tab. 
         </h:form> 
         <h:form id="ddkk"> 
          This is basic info tab. 
         </h:form> 
        </p:tab> 
       </p:accordionPanel> 
      </p:tab> 



     </p:tabView> 
    </h:body> 
</html> 

Ich primefaces 3.2, JSF 2.1, Tomcat 7, netbeans 7.1, Hibernate3


aktualisieren mit: @rags ich war ein Problem in activeindex haben. Nachdem der ActiveIndex und alles begann zu arbeiten, fing ich an, meinen Code zu vergleichen, um zu wissen, was falsch lief. Wenn ich nun in den Eingabefeldern und anderen Komponenten das Erforderlich = "Falsch" zu Erforderlich = "Wahr" änderte, wird der ActiveIndex nicht mehr funktionieren.

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:p="http://primefaces.org/ui" > 
    <h:head> 
     <title>Admin Panel</title> 

     <script type="text/javascript"> 
      function deleteObj(x){ 
       //alert("checking javascript - " + x); 
      } 
     </script> 

     <style type="text/css"> 
      .ui-accordion .ui-accordion-content{ 
       background-color: #eedae3; 
      } 
      .ui-accordion .ui-accordion-header { 
       height: 30px; 
       background-color: #e74f54; 
      } 
      .ui-tabs .ui-tabs-nav li{ 
       background-color: #6f97df; 
       height: 35px; 
      } 
      .datatable{ 
       background-color: #eedae3; 
      } 
     </style> 

    </h:head> 
    <h:body> 
     <h:form id="mainForm"> 

      <p:growl id="growl" showDetail="true" /> 

      <p:confirmDialog id="confirmDialog" message="Are you sure you want to delete the selected row ?" 
          header="Deleting Row" severity="alert" widgetVar="confirmation1"> 


       <p:commandButton id="confirm" value="Yes Sure" update=":mainForm:growl mainForm:myTabViewID:aPanel:countryTable" oncomplete="confirmation1.hide()" 
           action="#{profileInfoManagedBean.deleteObject}"> 
        <!--          <f:ajax render=":mainForm" />--> 
       </p:commandButton> 
       <p:commandButton id="decline" value="Not Yet" onclick="confirmation1.hide()" type="button" /> 
      </p:confirmDialog> 

      <p:tabView id="myTabViewID" activeIndex="#{profileInfoManagedBean.myCurrentTab}" > 
       <p:ajax event="tabChange" listener="#{profileInfoManagedBean.tabIsChanged}" /> 


       <p:tab id="locationInfoTab" title="Location Info"> 

        <p:accordionPanel id="aPanel" activeIndex="#{profileInfoManagedBean.myCurrentATab}"> 
         <p:tab id="tab1" title="Country"> 

          <p:outputPanel> 
           <h:panelGrid columns="3" cellpadding="5" cellspacing="5"> 

            <p:column> 
             <h:outputLabel for="country" value="Country: "></h:outputLabel> 
            </p:column> 
            <p:column> 
             <p:inputText id="country" value="#{profileInfoManagedBean.country.country}" required="false" label="Country"> 
              <p:watermark value="Enter a country name" for="country" /> 
              <f:validateLength for="country" minimum="5" maximum="20" /> 
              <p:ajax event="blur" update="msg1" /> 
              <f:validateRequired for="country" /> 
             </p:inputText> 
            </p:column> 
            <p:column> 
             <p:message id="msg1" for="country" display="icon"></p:message> 
            </p:column> 

           </h:panelGrid> 
           <p:commandButton value="Add" action="#{profileInfoManagedBean.addCountry}" update=":mainForm" style="margin:10px 0" id="btnAdd"/> 
          </p:outputPanel> 

          <p:separator /> 
          <p:outputPanel id="countryTable"> 

           <p:dataTable style="width: 700px;" var="coun" value="#{profileInfoManagedBean.countryList}" selection="#{profileInfoManagedBean.deletingObj}" rowKey="#{coun.countryId}" 
              paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
              paginator="true" rows="5" rowsPerPageTemplate="10,15,20,25" editable="true"> 
            <p:ajax event="rowEdit" update="@this" 
              listener="#{profileInfoManagedBean.onEditRow}" /> 

            <p:confirmDialog id="confirmDialog" message="Are you sure you want to delete the selected row ?" 
                header="Deleting Row" severity="alert" widgetVar="confirmation2"> 
             <p:commandButton id="confirm" value="Yes Sure" update=":mainForm" oncomplete="confirmation2.hide()" 
                 action="#{profileInfoManagedBean.deleteObject}" /> 
             <p:commandButton id="decline" value="Not Yet" onclick="confirmation2.hide()" type="button" /> 
            </p:confirmDialog> 


            <p:column headerText="Country"> 
             <p:cellEditor> 
              <f:facet name="output"> 
               <h:outputText value="#{coun.country}" /> 
              </f:facet> 
              <f:facet name="input"> 
               <p:inputText value="#{coun.country}" style="width:100%" /> 
              </f:facet> 
             </p:cellEditor> 
            </p:column> 

            <p:column id="inactive" filterBy="#{coun.isActive}" 
               headerText="isActive" footerText="exact" 
               filterOptions="#{profileInfoManagedBean.isActiveDropDown}" 
               filterMatchMode="exact"> 

             <p:cellEditor> 
              <f:facet name="output"> 
               <h:outputText value="#{coun.isActive}"></h:outputText> 
              </f:facet> 
              <f:facet name="input"> 
               <h:selectOneMenu value="#{coun.isActive}" > 
                <f:selectItem itemLabel="True" itemValue="true" /> 
                <f:selectItem itemLabel="False" itemValue="false" /> 
               </h:selectOneMenu> 
              </f:facet> 
             </p:cellEditor> 
            </p:column> 

            <p:column headerText="Edit"> 
             <p:rowEditor /> 

            </p:column> 

            <p:column headerText="Delete"> 
             <p:commandButton update=":mainForm:growl :mainForm:myTabViewID:aPanel:countryTable" icon="ui-icon-circle-close" action="#{profileInfoManagedBean.deleteCountry(coun.countryId)}" 
                 title="Delete Country" style="border-color:#FF0000" /> 
            </p:column> 


           </p:dataTable> 
          </p:outputPanel> 

         </p:tab> 

         <p:tab id="tab2" title="Province"> 

          <p:outputPanel> 
           <h:panelGrid columns="3" cellpadding="5" cellspacing="5"> 

            <p:column> 
             <p:selectOneMenu value="#{profileInfoManagedBean.province.country.countryId}" id="cou" 
                 required="false"> 
              <f:selectItem itemLabel="Select Here" itemValue="" /> 
              <f:selectItems 
               value="#{profileInfoManagedBean.countryList}" 
               var="coun" itemValue="#{coun.countryId}" itemLabel="#{coun.country}" /> 
              <p:ajax event="blur" update="msg2" /> 
             </p:selectOneMenu><p:message id="msg2" for="cou" display="icon" /> 
            </p:column> 

            <p:column> 
             <h:outputLabel for="province" value="Province: "></h:outputLabel> 
            </p:column> 
            <p:column> 
             <p:inputText id="province" value="#{profileInfoManagedBean.province.province}" required="false" label="Province"> 
              <p:watermark value="Enter a province name" for="province" /> 
              <f:validateLength minimum="5" maximum="20" /> 
              <p:ajax event="blur" update="msg3"></p:ajax> 
             </p:inputText> 
            </p:column> 
            <p:column> 
             <p:message id="msg3" for="province" display="icon"></p:message> 
            </p:column> 

           </h:panelGrid> 
           <p:commandButton value="Add" action="#{profileInfoManagedBean.addProvince}" update=":mainForm" style="margin:10px 0" id="btnAddProvince"/> 
          </p:outputPanel> 

          <p:separator /> 
          <p:outputPanel id="provinceTable"> 

           <p:dataTable style="width: 700px;" var="prov" value="#{profileInfoManagedBean.provinceList}" selection="#{profileInfoManagedBean.deletingObj}" rowKey="#{prov.provinceId}" 
              paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
              paginator="true" rows="5" rowsPerPageTemplate="10,15,20,25" editable="true"> 
            <p:ajax event="rowEdit" update="@this" 
              listener="#{profileInfoManagedBean.onEditRow}" /> 


            <p:column headerText="Province"> 
             <p:cellEditor> 
              <f:facet name="output"> 
               <h:outputText value="#{prov.province}" /> 
              </f:facet> 
              <f:facet name="input"> 
               <p:inputText value="#{prov.province}" style="width:100%" /> 
              </f:facet> 
             </p:cellEditor> 
            </p:column> 

            <p:column id="inactive" filterBy="#{coun.isActive}" 
               headerText="isActive" footerText="exact" 
               filterOptions="#{profileInfoManagedBean.isActiveDropDown}" 
               filterMatchMode="exact"> 

             <p:cellEditor> 
              <f:facet name="output"> 
               <h:outputText value="#{prov.isActive}"></h:outputText> 
              </f:facet> 
              <f:facet name="input"> 
               <h:selectOneMenu value="#{prov.isActive}" > 
                <f:selectItem itemLabel="True" itemValue="true" /> 
                <f:selectItem itemLabel="False" itemValue="false" /> 
               </h:selectOneMenu> 
              </f:facet> 
             </p:cellEditor> 
            </p:column> 

            <p:column headerText="Edit"> 
             <p:rowEditor /> 
             <p:commandButton icon="ui-icon-circle-close" onclick="deleteObj(5)" title="Delete Province" style="border-color:#FF0000" /> 
            </p:column> 

            <p:column headerText="Delete"> 

             <p:commandButton type="button" onclick="confirmation1.show()" 
                 id="delProvince" title="Delete Province" icon="ui-icon ui-icon-trash" /> 
            </p:column> 

            <p:column selectionMode="single"> 
             <f:facet name="header"> 
              <h:outputText value="select" /> 
             </f:facet> 
            </p:column> 


           </p:dataTable> 
          </p:outputPanel> 

         </p:tab> 

        </p:accordionPanel> 

       </p:tab> 


       <p:tab id="basicInfoTab" title="Basic info"> 
        <p:accordionPanel id="aPanel1"> 
         <p:tab id="tab2" title="basic info"> 
          This is basic info tab. 
          This is basic info tab. 
         </p:tab> 
        </p:accordionPanel> 
       </p:tab> 



      </p:tabView> 
     </h:form> 
    </h:body> 
</html> 

Ich habe viele Tabview und Akkordeon Tabs. activeindex hat funktioniert, wenn ich required="false" für jede Komponente eines Tabs gemacht habe. Ändern Sie alle zu required="true" verursacht activeindex nicht zu arbeiten, aber wenn Sie zu required="false" von Komponenten nur einer Registerkarte activeindex funktioniert gut.

+0

Was genau ist das Problem konfrontiert ist nicht klar. Kannst du bitte Details angeben? Es ist auch nützlich, wenn die Quelle der Bohne gepostet wird – rags

Antwort

4

Wenn <p:tabView in einem <h:form ist, wird _activeIndex aktualisiert. Wenn <p:tabView NICHT in einer <h:form ist, wird _activeIndex NICHT aktualisiert. Dies kann im POST mit Firebug gesehen werden.

Von was ich sagen kann, sollten _activeIndex und _activetab gleiche Wert mit TabView-Komponente haben.

Ich verwende den folgenden Code mit mehreren Registerkarten und andere Form in jedem Registerkarte:

public void tabIsChanged(TabChangeEvent event) { 
    //This code was taken directly from TabViewRenderer. 
    FacesContext context = FacesContext.getCurrentInstance(); 
    Map<String, String> params = context.getExternalContext().getRequestParameterMap(); 
    TabView tabView = (TabView) event.getComponent(); 
    String activeIndexValue = params.get(tabView.getClientId(context) + "_tabindex"); 

    //this.activeTab = Integer.parseInt(activeIndexValue); 
    this.myCurrentATab = Integer.parseInt(activeIndexValue); 

} 

Vielleicht eine Lösung für Sie.

+0

Ich benutze: Prime Faces 3.2, Mojarra 2.1.7, Apache Tomcat 7.0.26 – wwhite

+0

suchte seit ein paar Tagen jetzt. funktioniert wie Charme mit PF 4-SNAPSHOT und Mojarra 2.19 auf JBoss 7.1.1 – Przemek

1

Wenn Sie die aktive Registerkarte steuern möchten, ist dies eine Art und Weise:


<p:tabView> 

    <p:ajax event="tabChange" listener="#{bean.onTabChange}"/> 

    <p:tab title="TitleTabOne"></p:tab> 
    <p:tab title="TitleTabTwo"></p:tab> 
    <p:tab title="TitleTabThree"></p:tab> 

</p:tabView> 

public void onTabChange(TabChangeEvent event) { 
    TabView tabView = (TabView) event.getComponent(); 
    int activeTabIndex = tabView.getActiveIndex(); 
    System.out.println(activeTabIndex); 
    if(activeTabIndex == 1){      
     // Your tab is active, do something... 
    } 
} 

Ich hoffe, das ...

Good Luck hilft !