Jsf Primefaces编程选项卡菜单操作侦听器 背景和目的:

Jsf Primefaces编程选项卡菜单操作侦听器 背景和目的:,jsf,primefaces,Jsf,Primefaces,我想使用tabMenu,根据所选选项卡在同一页面上切换一些显示的内容。我选择tabMenu是因为它支持模型绑定,从而使我能够使用编程模型。我不想使用tabMenu进行导航,也不会再次请求当前页面。 我将我的实现放在一个复合组件(CC)中,以便在CC被重用或放在其他页面的情况下对设计部分具有灵活性。此CC的支持bean实现了ActionListener接口,该接口添加到添加到菜单模型的每个primefaces菜单项中。然后,重写方法的实现应该在后台更新模型,以便根据单击的菜单项正确显示动态内容。

我想使用tabMenu,根据所选选项卡在同一页面上切换一些显示的内容。我选择tabMenu是因为它支持模型绑定,从而使我能够使用编程模型。我不想使用tabMenu进行导航,也不会再次请求当前页面。 我将我的实现放在一个复合组件(CC)中,以便在CC被重用或放在其他页面的情况下对设计部分具有灵活性。此CC的支持bean实现了ActionListener接口,该接口添加到添加到菜单模型的每个primefaces菜单项中。然后,重写方法的实现应该在后台更新模型,以便根据单击的菜单项正确显示动态内容。 在我试图使用CC的页面上,我还使用primefaces选项卡视图来分隔不同的内容。在我要使用我的CC的选项卡中,我还使用primefaces accordionPanel,其中我的CC是其中一个选项卡的内容

错误情况和预期行为: 将我的复合组件放在accordionPanel的一个选项卡中,菜单的模型就正确地构建在我的支持bean中并显示出来了。单击一个菜单项不会导致触发的操作(我可以判断,因为eclipse不会在processAction方法的断点处停止)。根据服务器日志,不会引发异常

由于menuItem具有actionListener属性,可用于服务器端回调,因此我希望使用addActionListener()方法添加到menuItem的actionListener具有相同的功能

我还尝试将CC放置在外部选项卡视图之外,得到了相同的结果

问题: 是否可以使用tabMenu实现我的目标?除了标签菜单,我还有其他选择吗?为了获得想要的行为,我必须改变什么

页面定义:

 <p:tabView id="someTabViewId">
    <p:tab id="tabViewsFirstTab>
      <p:accordionPanel id="accordionPanelId" multiple="true" cache="false">
        <p:tab id="someTab1Id" title="someTab1Title">
... someTab1 content here ...
        </p:tab>

        <p:tab id="ccTab" title="ccTabTitle">
          <ccNameSpace:ccComponentName id="ccId" />
        </p:tab>

        <p:tab id="someTab2Id" title="someTab2Title">
... someTab2 content here ...
        </p:tab>
      </p:accordionPanel>
    </p:tab>
 </p:tabView>
  <composite:interface>
  </composite:interface>
  <composite:implementation xmlns:anotherCCNameSpace="http://java.sun.com/jsf/composite/components/someEntity/someSpecialContent">
    <h:panelGrid style="width:100%;">
      <p:tabMenu id="test1" model="#{ccBean.tabMenuModel}" />
      <anotherCCNameSpace:specialComponent id="test" />
    </h:panelGrid>
  </composite:implementation>
@Named
@ViewScoped
public class CcBean implements ActionListener, SomeCustomInterface {

  private MenuModel menuModel;

...

  @Override
  public void processAction(ActionEvent event) throws AbortProcessingException {
    this.doSomePreparations(event);
  }

 @PostConstruct
  public void postConstruct() {
    this.menuModel = new DefaultMenuModel();
    for (SomeGroupEntity groupEntity : this.getAllSomeGroupEntities()) {
      MenuItem menuItem = new MenuItem();
      menuItem.setId("menuItem" + groupEntity.getId());
      menuItem.setUpdate("test1 test");
      menuItem.addActionListener(this);
      menuItem.setImmediate(true);
      menuItem.setValue(groupEntity.getName());
      this.menuModel.addMenuItem(menuItem);
    }
  }


  public MenuModel getTabMenuModel() {
    return this.menuModel;
  }

...
}

我尝试过primefaces版本3.4.1和3.5-SNAPSHOT,结果相同。Prolem解决了!因为我还不能回答我自己的问题,所以现在就发表这一评论。接下来会有一个正确的答案。那么,解决方案在哪里呢?