Primeffaces选项卡视图活动索引工作不正常



我已经完全更改了代码。但活跃指数仍显示出问题。有时它会被呼叫,有时它不会。下面的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、Hibernate 3


更新:@raggs我在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>

我有很多选项卡和手风琴选项卡。当我为一个选项卡的每个组件制作required="false"时,activeindex起作用。将全部更改为required="true"会导致activeindex不起作用,但如果仅为一个标签的组件更改为required="false"activeindex也可以。

如果<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);
}

也许这是你的解决方案。

如果您想控制活动选项卡,这是一种方法:


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

我希望这能帮助。。。

祝你好运!

简单地说,将tabViewactiveIndex一起使用,并将代码添加到tabView中,即可解决如下问题:

        <p:tabView id="tv" activeIndex="#{yourBean.activeTabIndex}">
            <p:ajax event="tabChange" process="@this"/>
        </p:tabView>

如果没有tabChangeEventactiveIndex将无法工作。

最新更新