Actually it's just JSF 2 problem which I believe should be solved at some point by the Oracle and Apache guys. Dynamically rendering of the components (which was at component tree before but just not rendered) works fine in JSF as it pre-renders resources for all the components even for those which are not rendered. But that is not applied to the case when the component was not present in JSF tree at all. And unfortunately it's your case. And the only workaround we found:add <dropDownMenu rendered="false"/> to the page.
<rich:toolbar height="26px" binding="#{dropDownMenuBean.menuBar}"/>
<rich:toolbar rendered="false" />
<rich:dropDownMenu rendered="false" />
<rich:menuItem rendered="false" />
</h:form>
@ViewScoped
public class DropDownMenuBean {
private UIToolbar menuBar;
public void setMenuBar(UIToolbar menuBar) {
this.menuBar = menuBar;
}
public UIToolbar getMenuBar() {
FacesContext ctx = FacesContext.getCurrentInstance();
menuBar = (UIToolbar) ctx.getApplication()
.createComponent(ctx, UIToolbar.COMPONENT_TYPE,
"org.richfaces.ToolbarRenderer");
UIDropDownMenu dropDownMenu = (UIDropDownMenu) ctx.getApplication()
.createComponent(ctx, UIDropDownMenu.COMPONENT_TYPE,
"org.richfaces.DropDownMenuRenderer");
HtmlOutputText label = (HtmlOutputText) ctx.getApplication()
.createComponent(HtmlOutputText.COMPONENT_TYPE);
label.setValue("File");
dropDownMenu.getFacets().put(UIDropDownMenu.Facets.label.name(), label);
dropDownMenu.setMode(Mode.ajax);
dropDownMenu.setHideDelay(0);
UIMenuItem menItm = (UIMenuItem) ctx.getApplication().createComponent(ctx,
UIMenuItem.COMPONENT_TYPE,
"org.richfaces.MenuItemRenderer");
menItm.setLabel("New");
menItm.setIcon("/images/icons/create_doc.gif");
menItm.setMode(Mode.ajax);
menItm.setOnclick("alert('hello');");
UIMenuItem.COMPONENT_TYPE,
"org.richfaces.MenuItemRenderer");
menItm2.setLabel("Open");
menItm2.setIcon("/images/icons/open_doc.gif");
menItm2.setMode(Mode.ajax);
menItm2.setOnclick("alert('hello2');");
menuBar.getChildren().add(dropDownMenu);
return menuBar;
}
}