2017-01-27 13 views
2

Я создал контекстное меню dataTable и связанное с ним контекстное меню, но не знаю, как настроить listSelect event listener. Вот часть кода:Как программно настроить прослушиватель событий rowSelect для dataTable

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); 

Ищу эквивалент, после чего могут быть добавлены в бэк-боба:

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

Также возможно добавить одиночные и двойные обработчики событий щелчка мыши для dataTable в бэк-компоненте без добавления каких-либо «< p: ajax event» в файле xhtml?

+0

1 Вопрос на вопрос, пожалуйста ... _ «Также возможно добавить одиночных и двойных прослушивателей событий щелчка мыши для dataTable в бэк-компоненте без добавления каких-либо« Kukeltje

ответ

2

Ищу эквивалент, после чего могут быть добавлены в бэк-боба:

<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 на DataTable. AjaxBehavior регистрирует Listener, у которого есть методExpression, настроенный для вызова метода обработчика событий 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, новый класс [0]); \t \t AjaxBehavior ajaxBehavior = new AjaxBehavior(); \t \t ajaxBehavior.addAjaxBehaviorListener (новый AjaxBehaviorListenerImpl (me, null)); \t \t table.addClientBehavior ("rowSelect", ajaxBehavior); public void onRowSelect (событие SelectEvent) { // Выходное сообщение } ' – amah

+0

Я не понимаю, что вы имеете в виду. Вы принимаете аргумент myBean.selectItem в своей среде? – JanPl

+0

Я немного изменил ваш код, чтобы «# agentBean.onRowSelect» был использован как функция, которая будет вызываться при выборе строки. MethodExpression me = ef.createMethodExpression (elc, "# {agentBean.onRowSelect}", String.class, новый класс [0]); table.addClientBehavior ("rowSelect", ajaxBehavior); – amah