我现在真的需要你的帮助。我现在花了将近一个星期来解决这个问题,但没有成功。
我正在使用PrimeFaces,我需要使用动态UIComponents创建动态表单。这对我来说很好。
接下来,对于这些动态创建的UIComponents,我需要显示动态上下文菜单。这对我来说也很好,但是当我点击MenuItems时,我的actionListener没有被触发。
以下是我的代码的样子:
private void addContextMenu(Panel panel, ......){
...................
Submenu submenu;
MenuItem menuItem;
Application application = FacesContext.getCurrentInstance().getApplication();
ExpressionFactory expressionFactory = application.getExpressionFactory();
ContextMenu contextMenu = (ContextMenu) application.createComponent(ContextMenu.COMPONENT_TYPE);
contextMenu.setStyleClass("applyBG");
contextMenu.setFor(panel.getId());
contextMenu.setId("CM_"+panel.getId().substring(3));
..................
..................
//Add SubMenus for Parent TableContainerElements
do{
submenu = (Submenu) application.createComponent(Submenu.COMPONENT_TYPE);
submenu.setLabel(..........);
submenu.setId(........);
menuItem = (MenuItem) application.createComponent(MenuItem.COMPONENT_TYPE);
menuItem.setId(.......);
menuItem.setValue(......);
menuItem.addActionListener(
new MethodExpressionActionListener(expressionFactory.createMethodExpression(
FacesContext.getCurrentInstance().getELContext(),
"#{testManagedBean.checkTestCommand}", null, new Class[] { ActionEvent.class })));
submenu.getChildren().add(menuItem);
<.......Add one more MenuItem to subMenu......>
contextMenu.getChildren().add(submenu);
}while(...........);
panel.getChildren().add(contextMenu);
}
这是我的ActionListener的样子:
public void checkTestCommand(ActionEvent ae){
System.err.println("Test Command Received");
MenuItem menuItem = (MenuItem)ae.getSource();
System.err.println(menuItem.getId());
ContextMenu contextMenu = (ContextMenu)menuItem.getParent();
System.err.println(contextMenu.getId());
}
请告诉我这里出了什么问题。我真的很感激。
谢谢和最诚挚的问候, 阿南德。
答案 0 :(得分:0)
您的代码中存在问题。匿名内部类不适用于addactionlistener property.do我希望它能帮到你。
menuItem.addActionListenr(new classname);
//create class implements actionlistener interface
classname implements ActionListenr{
privide your code
}