2017-01-27 24 views
2

我已经在支持bean中创建了dataTable和关联的上下文菜单,但不知道如何配置rowSelect事件侦听器。下面是部分代码:如何以编程方式为dataTable配置rowSelect事件侦听器

DataTable table = (DataTable) application.createComponent(DataTable.COMPONENT_TYPE); 
table.setValue(model); 
table.setSelectionMode("single"); 
table.setVar("item"); 
table.setId("tableId"); 
       : 

    ContextMenu ctxMenu = new ContextMenu(); 
    ctxMenu.setFor("tableId"); 

    DynamicMenuModel ctxModel = new DynamicMenuModel(); 

    ctxMenu.setModel(ctxModel); 

    rightCenterPanel.getChildren().add(ctxMenu); 
    rightCenterPanel.getChildren().add(table); 

    RequestContext.getCurrentInstance().update(TreeManagedBean.rightCenterForm); 

我正在寻找能在支持bean中添加下列等价的:

<p:ajax event="rowSelect" listener="#{myBean.selectItem}"/> 

也是它可以添加单,双鼠标点击事件监听器对于backing bean中的dataTable,而不在xhtml文件中添加任何“< p:ajax事件”?

+0

1每个问题的问题,请... _“还有可能在后台bean中为dataTable添加单鼠标和双鼠标点击事件侦听器,而无需在xhtml文件中添加任何” Kukeltje

回答

2

我正在寻找能在支持bean中添加下列等价的:

<p:ajax event="rowSelect" listener="#{agentBean.selectItem}"/> 

使用AjaxBehavior这样的:

import javax.el.ExpressionFactory; 
import javax.el.MethodExpression; 
import org.primefaces.behavior.ajax.AjaxBehavior; 
import org.primefaces.behavior.ajax.AjaxBehaviorListenerImpl; 

final FacesContext fc = FacesContext.getCurrentInstance(); 
final ExpressionFactory ef = application.getExpressionFactory(); 
final MethodExpression me = ef.createMethodExpression(fc.getELContext(), 
    "#{agentBean.selectItem}", String.class, new Class[0]); 
final MethodExpression meArg = ef.createMethodExpression(fc.getELContext(), 
    "#{agentBean.selectItem}", String.class, new Class[]{SelectEvent.class}); 
final AjaxBehavior ajaxBehavior = new AjaxBehavior(); 
ajaxBehavior.addAjaxBehaviorListener(new AjaxBehaviorListenerImpl(me, meArg)); 
dt.addClientBehavior("rowSelect", ajaxBehavior); 

提供一个事件处理程序 agentBean类中的方法:

public void selectItem(final SelectEvent event) {} 

当表格行被选中时,它将被调用。

它是如何工作

事件rowSelect被链接到AjaxBehavior在数据表。 AjaxBehavior注册一个Listener,该Listener的MethodExpression被配置为调用事件处理函数的方法agentBean.selectItem

+0

感谢但没有调用rowSelect侦听器: 'FacesContext fc = FacesContext.getCurrentInstance(); \t \t ExpressionFactory ef = application.getExpressionFactory(); \t \t ELContext elc = fc.getELContext(); MethodExpression me = ef.createMethodExpression(elc, \t \t \t“#{agentBean.onRowSelect}”,String.class,new Class [0]); \t \t AjaxBehavior ajaxBehavior = new AjaxBehavior(); \t \t ajaxBehavior.addAjaxBehaviorListener(new AjaxBehaviorListenerImpl(me,null)); \t \t table.addClientBehavior(“rowSelect”,ajaxBehavior); public void onRowSelect(SelectEvent event){ //输出消息 }' – amah

+0

我不明白你的意思。你对你的环境采用了参数myBean.selectItem吗? – JanPl

+0

我稍微修改了代码,以便在选中某行时使用“#{agentBean.onRowSelect}”作为函数来调用 MethodExpression me = ef。createMethodExpression(elc,“#{agentBean.onRowSelect}”,String.class,new Class [0]); table.addClientBehavior(“rowSelect”,ajaxBehavior); – amah

相关问题