对于以编程方式创建的UI组件的编程创建的ContextMenu,actionListener不会触发MenuItem

时间:2013-08-03 14:57:31

标签: jsf-2 primefaces contextmenu menuitem

我现在真的需要你的帮助。我现在花了将近一个星期来解决这个问题,但没有成功。

我正在使用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());
}

请告诉我这里出了什么问题。我真的很感激。

谢谢和最诚挚的问候, 阿南德。

1 个答案:

答案 0 :(得分:0)

您的代码中存在问题。匿名内部类不适用于addactionlistener property.do我希望它能帮到你。

menuItem.addActionListenr(new classname);

//create class implements actionlistener interface

classname implements ActionListenr{

    privide your code
}