Es herrscht auch in anderen Foren große Verwirrung
Aber der Kollege hier scheint soweit auf dem richtigen Dampfer zu sein: How to do MenuItem.addActionListener in 4.0? - Prime Community Forum
You can try to use org.primefaces.component.menuitem.UIMenuItem:
Gut, dass das in der offiziellen Doku steht! hust
*** Edit ***
Noch ein kurzes Update, der Codeblock sieht bei mir jetzt so aus:
private MenuElement buildStornierenItem(Boolean disabled) {
UIMenuItem stornieren = new UIMenuItem();
stornieren.setId("stornierenMenuItem");
stornieren.setDisabled(disabled);
stornieren.setTitle("Stornieren ist nur möglich, wenn keine Sendungen zugeordnet sind");
stornieren.addActionListener(listener);
stornieren.setActionExpression(buildMethodExpression("#{lkwDetailController.remove(lkwDetailController.current)}"));
return stornieren;
}
private MethodExpression buildMethodExpression(String action) {
final Class<?>[] paramTypes = new Class<?>[0];
FacesContext fc = FacesContext.getCurrentInstance();
ExpressionFactory ef = fc.getApplication().getExpressionFactory();
return ef.createMethodExpression(fc.getELContext(), action, String.class, paramTypes);
}
Hier kann ich auf dem altebekannten weg eine Action setzen und auch ActionListener anhängen. Wenn der PrimeFaces Renderer jetzt versucht das Menü zu rendern, bekomme ich:
java.lang.IllegalArgumentException: 6
at javax.faces.component.UIComponentBase.validateId(UIComponentBase.java:542)
at javax.faces.component.UIComponentBase.setId(UIComponentBase.java:363)
at org.primefaces.model.menu.BaseMenuModel.generateUniqueIds(BaseMenuModel.java:54)
at org.primefaces.model.menu.BaseMenuModel.generateUniqueIds(BaseMenuModel.java:42)
at org.primefaces.model.menu.DefaultMenuModel.generateUniqueIds(DefaultMenuModel.java:28)
at org.primefaces.component.menu.BaseMenuRenderer.encodeEnd(BaseMenuRenderer.java:102)
Die Ursache dafür:
private List<MenuElement> elements;
public BaseMenuModel() {
elements = new ArrayList<MenuElement>();
}
public void addElement(MenuElement element) {
elements.add(element);
}
public List<MenuElement> getElements() {
return elements;
}
public void generateUniqueIds() {
this.generateUniqueIds(getElements(), null);
}
private void generateUniqueIds(List<MenuElement> elements, String seed) {
if(elements == null || elements.isEmpty()) {
return;
}
int counter = 0;
for(MenuElement element : elements) {
String id = (seed == null) ? String.valueOf(counter++) : seed + "_" + counter++;
element.setId(id);
if(element instanceof MenuGroup) {
generateUniqueIds(((MenuGroup) element).getElements(), id);
}
}
}
}
Im BaseMenuModel werden ohne Rücksicht auf Verluste IDs generiert und über (eventuell schon gesetzte IDs) überbügelt. Die für mein UiMenuItem ausgewählte ID „6“ schmeckt dem Validator in javax.faces.component.UIComponentBase aber überhaupt nicht, es gibt eine IllegalArgumentException. Ich sehe gerade keinen anderen Weg, als das DefaultMenuModel von Primefaces zu überschreiben und diese Methode zu ändern. Eventuell ist es hier aber sogar gerechtfertigt einen Bugreport einzureichen.
Noch ein Edit: Der Bugreport existiert, vegetiert vor sich hin und wird fleissig ignoriert: Google Code Archive - Long-term storage for Google Code Project Hosting.
Gruß,
Tim