我动态创建我的面板,我也想动态添加ajax close侦听器,但对我不起作用。对于每个小组:
int u = _memosId.get(i);
Panel panel = (Panel)_application.createComponent(_context, "org.primefaces.component.Panel", "org.primefaces.component.PanelRenderer");
panel.setId("mymemo_" + String.valueOf(u));
panel.setHeader(_userNames.get(i));
panel.setClosable(true);
panel.setToggleable(true);
HtmlOutputText memo = new HtmlOutputText();
memo.setValue(_userMemos.get(i));
panel.getChildren().add(memo);
AjaxBehavior ajaxBehavior =(AjaxBehavior)_context.getApplication().createBehavior(AjaxBehavior.BEHAVIOR_ID);
ajaxBehavior.addAjaxBehaviorListener(new ClosePanelListener());
ajaxBehavior.setTransient(true);
panel.addClientBehavior("close", ajaxBehavior);
_column1.addWidget(panel.getId());
getDashboard().getChildren().add(panel);
和我的班级听众:
private static class ClosePanelListener implements AjaxBehaviorListener
{
@Override
public void processAjaxBehavior(AjaxBehaviorEvent event) throws AbortProcessingException
{
System.out.println("----------->>>>>>>>>>AjaxListener CALLED!!! ");
}
}
未调用侦听器。
答案 0 :(得分:3)
您的具体问题是由于以下行引起的,
AjaxBehavior ajaxBehavior =(AjaxBehavior)_context.getApplication().createBehavior(AjaxBehavior.BEHAVIOR_ID);
基本上创建了<f:ajax>
,而此<p:panel>
关闭侦听器实际上仅由<p:ajax>
支持。您还可以在生成的HTML输出中看到它; Mojarra.ab()
(或者,如果你使用的是MyFaces而不是Mojarra,则使用MyFaces的特定功能)而不是PrimeFaces.ab()
。
为了正确创建<p:ajax>
,您需要使用PrimeFaces自己的AjaxBehavior
,让您的侦听器从PrimeFaces自己的AjaxBehaviorListenerImpl
扩展:
import org.primefaces.component.behavior.ajax.AjaxBehavior;
import org.primefaces.component.behavior.ajax.AjaxBehaviorListenerImpl;
AjaxBehavior ajaxBehavior = new AjaxBehavior();
public static class ClosePanelListener extends AjaxBehaviorListenerImpl
(请注意,我已将嵌套类从private
更改为public
,否则您可能会因某些EL impls而出现可见性问题)
无关,变量命名约定_application
和_context
表明它们被保存为支持bean类的实例变量。这对于设计和线程安全来说是一个非常糟糕的主意。它们应该在方法局部范围内获得,并且永远不会被指定为实例变量。
此外,您是否考虑过<ui:repeat>
或<c:forEach>
以便在循环中动态创建面板?这将比这个混乱更清晰,更具声明性的代码。
答案 1 :(得分:0)
尝试使用MethodExpression而不是直接创建侦听器。在这种情况下,ClosePanelListener应该是托管bean。
Application application = _context.getApplication();
ExpressionFactory ef = _context.getApplication().getExpressionFactory();
MethodExpression me = ef.createMethodExpression(_context.getELContext(),
"#{closePanelListenerBean.processAjaxBehavior()}", null, new Class[]{AjaxBehaviorEvent.class});
AjaxBehavior ajaxBehavior = new AjaxBehavior();
AjaxBehaviorListenerImpl ajaxBehaviorImpl = new AjaxBehaviorListenerImpl(me, me);
ajaxBehavior.addAjaxBehaviorListener(ajaxBehaviorImpl);
panel.addClientBehavior("close", ajaxBehavior);