Jsf Primefaces 5.0选项卡关闭侦听器不工作

Jsf Primefaces 5.0选项卡关闭侦听器不工作,jsf,jsf-2,primefaces,Jsf,Jsf 2,Primefaces,如果从支持bean生成制表符,则不会触发TabCloseEvent。 TabCloseEvent与普通xhtml选项卡配合使用效果良好 这是我的密码 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:p="http://primefaces.org/ui"> <h:head>

如果从支持bean生成制表符,则不会触发TabCloseEvent。 TabCloseEvent与普通xhtml选项卡配合使用效果良好

这是我的密码

   <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:h="http://java.sun.com/jsf/html"
          xmlns:p="http://primefaces.org/ui">
        <h:head>
            <title>Test Title</title>
        </h:head>
        <h:body>
            <h:form id="form">
                <p:growl id="growl" showDetail="true" />

                <p:tabView id="tabview"
                           value="#{TestBean.tabList}"
                           var="tab"
                           widgetVar="tabviewV">

                    <p:ajax event="tabClose" listener="#{TestBean.onTabCloseAction}"  update=":form:growl"/>
                    <p:tab id="tab"  title="#{tab}" closable="true" >
                        <h:outputText value="#{tab}"/>
                    </p:tab>
                </p:tabView>

            </h:form>

        </h:body>
    </html>

考试题目
托管bean

    @ManagedBean(name = "TestBean")
    @ViewScoped
    public class TestBean {

        private List<String> tabList = new ArrayList<String>();

        public TestBean() {
            tabList.add("Test Tab 1");
            tabList.add("Test Tab 2");
            tabList.add("Test Tab 3");
            tabList.add("Test Tab 4");
        }

        public void onTabCloseAction(TabCloseEvent event) {
            System.out.println("Tab Closed Event : " + event.getTab().getTitle());
            FacesMessage msg = new FacesMessage("Tab Closed", "Closed tab: " + event.getTab().getTitle());
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }

        public List<String> getTabList() {
            return tabList;
        }

        public void setTabList(List<String> tabList) {
            this.tabList = tabList;
        }
    }
@ManagedBean(name=“TestBean”)
@视域
公共类TestBean{
私有列表tabList=新的ArrayList();
公共TestBean(){
表格列表添加(“测试表1”);
表格列表添加(“测试表2”);
表格列表添加(“测试表3”);
表格列表添加(“测试表4”);
}
公共无效onTabCloseAction(TabCloseEvent事件){
System.out.println(“制表符关闭事件:+Event.getTab().getTitle());
FacesMessage msg=新的FacesMessage(“Tab Closed”,“Closed Tab:”+event.getTab().getTitle());
FacesContext.getCurrentInstance().addMessage(null,msg);
}
公共列表getTabList(){
返回小报;
}
公共无效设置列表(列表列表列表){
this.tabList=tabList;
}
}

我用的是PrimeFaces5.0。此外,我还尝试在p:ajax中使用process=“@this”,但结果是一样的。

我尝试了showcase和您的代码中提到的方法,但没有完全起作用,所以我尝试了另一种方法让我们看看

小脸

  <p:growl id="growl" showDetail="true" />
<p:tabView id="tabView" binding="#{homeBean.tabView}" >

        <p:ajax event="tabClose" listener="#{homeBean.onTabClose}" update=":form:growl"/>

    </p:tabView>
现在它似乎起作用了。 注意:我使用了Primefaces 5.0,这是一个

它一直是


因此,您只需将库更新为5.0.2或5.0.3即可。它正在工作,但event.getTab()正在变为null。我试过event.getComponent()和event.getSource()都返回TabView对象。你可以使用event.getTab()获得closed tab的对象。我使用相同的方法得到它。
    private TabView tabView = new TabView();

    Tab tab1 = new Tab();
    tab1.setClosable(true);
    tab1.setTitle("Business Partner");
    Tab tab2 = new Tab();
    tab2.setClosable(true);
    tab2.setTitle("Manage Favorites");
    tabView.getChildren().add(tab1);
    tabView.getChildren().add(tab2);