Primefaces tabview活动索引无法正常工作

时间:2012-04-02 06:56:38

标签: jsf primefaces tabview

我完全改变了我的代码。但活跃指数仍然存在问题。有时它会被调用,有时它不会被调用。 以下xhtml代码有什么问题?

<?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>

我正在使用primefaces 3.2,JSF 2.1,Tomcat 7,netbeans 7.1,Hibernate3


更新:@rags 我在activeindex中遇到了一些问题。 在activeindex和一切开始工作之后,我开始比较我的代码以了解出了什么问题。 现在,当我在输入字段和其他组件中将required =“false”更改为required =“true”时,activeindex将不再起作用。

<?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>

我有很多tabview和accordion标签。当我为一个标签的每个组件创建activeindexrequired="false"工作。将所有内容更改为required="true"会导致activeindex无法正常工作,但如果您更改为仅required="false"只有一个标签activeindex的组件的{{1}},则工作正常。

2 个答案:

答案 0 :(得分:5)

如果<p:tabView位于<h:form,则会更新_activeIndex。 如果<p:tabView中不存在<h:form,则不会更新_activeIndex。 这可以在使用Firebug的POST中看到。

据我所知,_activeIndex和_activetab应该与TabView组件具有相同的值。

我在多个标签中使用以下代码,每个标签中都有不同的表单:

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);

}

也许这是一个适合你的解决方案。

答案 1 :(得分:2)

如果您想控制活动标签,这是一种方式:

<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...
    }
}

我希望这会有所帮助......

祝你好运!