p:menuBar
及其p:menuItem
是在运行时生成的。它们正确渲染并且功能完美,但是当点击菜单中的任何选项时,没有任何反应。
我的index.xhtml
非常简单。这只是p:tabView
通过dataentry.xhtml
合成我的ui:include
。 dataentry.xhtml
上的组件是发生问题的地方。
//dataentry.xhtml
<?xml version="1.0" encoding="UTF-8"?>
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:form id="dataEntryForm">
<p:menubar id="menuBar" binding="#{dataEntryBean.menuBar}" />
<p:dashboard id="dashboard" binding="#{dataEntryBean.dashboard}"/>
</h:form>
</ui:composition>
以下是生成p:menuBar
的方法。同样,所有这些都在页面上正确呈现,当您点击某些内容时它不会做任何事情。
private @NotNull Menubar spawnMenuBar() {
final MenuModel MODEL = new DefaultMenuModel();
{
final DefaultSubMenu SM = new DefaultSubMenu("Create New...", "ui-icon-circle-plus");
Arrays.stream(Type.values()).forEach(CT -> {
final String CT_ALT = CT.toInitialCaps();
final DefaultMenuItem DMI = new DefaultMenuItem(CT_ALT + " Card");
DMI.setId("createNew" + CT_ALT + "Type");
DMI.setParam("TYPE", CT.name());
DMI.setTitle("Creates a new " + CT_ALT + " type panel in the dashboard.");
DMI.setCommand("#{dataEntryBean.addNewTypePanel(param.get('TYPE'))}");
SM.addElement(DMI);
});
MODEL.addElement(SM);
}
{
final DefaultSubMenu SM = new DefaultSubMenu("Global Actions...", "ui-icon-alert");
// Implementation removed for brevity's sake...
MODEL.addElement(SM);
}
final Menubar MENU = new Menubar();
MENU.setModel(MODEL);
return MENU;
}
...最后,这是第一个p:menuItem
中所有p:subMenu
s应该调用的方法。
public void addNewTypePanel(final String TYPE) {
System.out.println("Method Call: addNewTypePanel(" + TYPE + ")");
// Implementation removed for brevity's sake...
}
println()
中的addNewTypePanel()
永远不会出现。
奇怪(并且,我怀疑,无关),此bean的构造函数的第一行上的println()
出现两次(然后第三次加载p:tabView
中的相应选项卡时)。
任何想法?
doHope(HopeSeverity.VERY_HARD);
p:tabView
并从h:form
复制dataentry.xhmtl
来重新测试此代码(请参阅下面的代码块)。不幸的是,问题(问题?)是一样的。仍然没有响应click,仍然看到bean的构造函数被调用三次。
// index.xhtml (alt version, same behavior)
<f:view>
<h:body>
<h3>Some Text</h3>
<h:form id="dataEntryForm">
<p:menubar id="menuBar" binding="#{dataEntryBean.menuBar}" />
<p:dashboard id="dashboard" binding="#{dataEntryBean.dashboard}"/>
</h:form>
</h:body>
</f:view>
为了澄清,bean是@SessionScoped
和@ManagedBean
。我正在使用MyFaces 2.2.10在Tomcat 8.0.33上测试所有这些。