我正在动态创建一个MenuItem,我想在单击MenuItem时添加自定义侦听器。
我尝试添加addActionListener和setActionListener,但是在单击链接时都不会调用它们。
似乎有一个名为“监听器”的List附加到MenuItem(我可以在静态调试监听器的MenuItem设置时看到这一点)。知道如何正确添加监听器吗?
答案 0 :(得分:3)
需要按照以下方式创建和添加它们(从one of my previous answers复制):
FacesContext context = FacesContext.getCurrentInstance();
MethodExpression actionListener = context.getApplication().getExpressionFactory()
.createMethodExpression(context.getELContext(), "#{bean.actionListener}", null, new Class[] {ActionEvent.class});
uiCommandComponent.addActionListener(new MethodExpressionActionListener(actionListener));
...其中#{bean.actionListener}
实际存在,并在与托管bean名称bean
关联的支持bean类中声明如下:
public void actionListener(ActionEvent event) {
// ...
}
更重要的是,您需要为任何动态创建的 UICommand
(和UIInput
)组件提供固定ID,否则它将获得一个自动生成的ID可能导致JSF在应用请求值阶段无法找到/关联它。
因此,也这样做:
uiCommandComponent.setId("someFixedId");
答案 1 :(得分:0)
BalusC指出的主要问题是您需要设置ID。 然后,您可以添加事件侦听器,如下所示: private MenuItem createItem(String name){ MenuItem item = new MenuItem(); item.addActionListener(new ActionListener(){
public void processAction(ActionEvent event)
throws AbortProcessingException {
// handle event
}
});
item.setValue(name);
return item;
}