JSF Добавление слушателей действий - PullRequest
1 голос
/ 16 февраля 2010

Я динамически создаю MenuItem и хочу добавить пользовательский прослушиватель при нажатии на MenuItem.

Я пытался добавить addActionListener и setActionListener, но ни один из них не вызывается при нажатии на ссылку.

Похоже, что к MenuItem прикреплен список «слушатели» (я вижу это при статической отладке установки MenuItem со слушателем) Есть идеи, как правильно добавить слушателя?

Ответы [ 2 ]

3 голосов
/ 16 февраля 2010

Их нужно создать и добавить следующим образом (скопировано из одного из моих предыдущих ответов ):

FacesContext context = FacesContext.getCurrentInstance();
MethodExpression actionListener = context.getApplication().getExpressionFactory()
    .createMethodExpression(context.getELContext(), "#{bean.actionListener}", null, new Class[] {ActionEvent.class});
uiCommandComponent.addActionListener(new MethodExpressionActionListener(actionListener));

... где #{bean.actionListener} действительно существует и объявляется следующим образом в классе базового компонента, связанном с именем управляемого компонента bean:

public void actionListener(ActionEvent event) {
    // ...
}

Что более важно, вам нужно дать любому динамически созданному UICommandUIInput) рассматриваемому компоненту также фиксированный идентификатор, иначе он получит автоматически сгенерированный идентификатор, который может привести к тому, что JSF не сможет найдите / сопоставьте его на этапе применения значений запроса.

Таким образом, сделайте так же:

uiCommandComponent.setId("someFixedId");
0 голосов
/ 16 февраля 2010

Основная проблема, указанная BalusC, заключается в том, что вам необходимо установить идентификатор. Затем вы можете добавить слушателей событий следующим образом: частный MenuItem createItem (имя строки) { MenuItem item = new MenuItem (); item.addActionListener (новый ActionListener () {

        public void processAction(ActionEvent event)
                throws AbortProcessingException {
            // handle event

        }
    });
    item.setValue(name);
    return item;
}
...