Я пытаюсь создать SplitButton программно.Кнопка отображается на странице, но слушатели действия не вызываются (ни для кнопки, ни для пунктов меню).Я сделал то же самое для CommandButton (следуя предложенному решению здесь ), и он работает.
Моя попытка:
public SplitButton createSplitButton(FacesContext context, String unique_id){
SplitButton splitButton = (SplitButton)context.getApplication().getViewHandler()
.getViewDeclarationLanguage(context, context.getViewRoot().getViewId())
.createComponent(context, "http://primefaces.org/ui", "splitButton", new HashMap<>());
splitButton.setId(unique_id);
splitButton.setValue("splitbutton");
splitButton.setAjax(true);
addMenuItems(splitButton);
this.addPrimefacesAjaxSupport(splitButton,splitButton.getDefaultEventName(),"#{myBean.myAction}");
}
private AjaxBehavior addPrimefacesAjaxSupport(UIComponentBase comp, String event, String actionListener){
MyAjaxBehavior ajaxBehavior = new MyAjaxBehavior ();
ajaxBehavior.setListener( JSFUtils.createMethodExpression(actionListener, void.class,new Class[]{ BehaviorEvent.class}) );
ajaxBehavior.setProcess( "@this" );
comp.addClientBehavior( event, ajaxBehavior );
return ajaxBehavior;
}
private void addMenuItems(SplitButton splitButton){
org.primefaces.component.menuitem.UIMenuItem uiMenuItem = (org.primefaces.component.menuitem.UIMenuItem)context.getApplication().getViewHandler()
.getViewDeclarationLanguage(context, context.getViewRoot().getViewId())
.createComponent(context, "http://primefaces.org/ui", "menuitem", new HashMap<>());
uiMenuItem.setAjax(true);
uiMenuItem.setValue("item "+index);
uiMenuItem.setId(String.valueOf("i"+index++));
this.addPrimefacesAjaxSupport(uiMenuItem,uiMenuItem.getDefaultEventName(),getReRenderId(),"#{myBean.myAction}");
splitButton.getChildren().add(uiMenuItem);
}
public void myAction(javax.faces.event.BehaviorEvent event) {
logger.warn("Welcome to Primefaces!!");
}