java.lang.IllegalStateException: этот тип обработчика не может быть присоединен к нескольким компонентам - PullRequest
1 голос
/ 07 июня 2011

Это исключение:

java.lang.IllegalStateException: this kind of handler cannot be attached to multiple components; it is already attached to component [MarkupContainer [Component id = textField1]], but component [MarkupContainer [Component id = textField2]] wants to be attached too
at org.apache.wicket.behavior.AbstractAjaxBehavior.bind(AbstractAjaxBehavior.java:70)
at org.apache.wicket.Component.add(Component.java:973)
at info.ems.wicket.page.HomePage.<init>(HomePage.java:23)

выбрасывается по следующему коду:

public class HomePage extends MasterPage {

    public HomePage() {
        AjaxEventBehavior ajaxOnClickBehavior = new AjaxEventBehavior("onClick") {

            private static final long serialVersionUID = 1L;

            @Override
            protected void onEvent(AjaxRequestTarget target) {
                // Same behavior of both the textField1 and textField2
            }
        };

        add(new TextField<String>("textField1", new Model<String>("Text Field 1")).add(ajaxOnClickBehavior));
        add(new TextField<String>("textField2", new Model<String>("Text Field 2")).add(ajaxOnClickBehavior));       
    }
}

Но это нормально:

public class HomePage extends MasterPage {

    public HomePage() {
        add(new TextField<String>("textField1", new Model<String>("Text Field 1")).add(new AjaxEventBehavior("onClick") {

            private static final long serialVersionUID = 1L;

            @Override
            protected void onEvent(AjaxRequestTarget target) {
                // Behavior of textField1, same as textField2
            }
        }));
        add(new TextField<String>("textField2", new Model<String>("Text Field 2")).add(new AjaxEventBehavior("onClick") {

            private static final long serialVersionUID = 1L;

            @Override
            protected void onEvent(AjaxRequestTarget target) {
                // Behavior of textField2, same as textField1 
            }
        }));        
    }
}

Почему?

Спасибо.

Добавлено:

public class HomePage extends MasterPage {

    public HomePage() {
        add(new TextField<String>("textField1", new Model<String>("Text Field 1")).add(new AjaxOnClickBehavior("onClick")));
        add(new TextField<String>("textField2", new Model<String>("Text Field 2")).add(new AjaxOnClickBehavior("onClick")));
    }

    private class AjaxOnClickBehavior extends AjaxEventBehavior {

        private static final long serialVersionUID = 1L;

        public AjaxOnClickBehavior(String event) {
            super(event);
        }

        @Override
        protected void onEvent(AjaxRequestTarget target) {
            // Same behavior of both the textField1 and textField2
        }

    }
}

Ответы [ 2 ]

6 голосов
/ 07 июня 2011

По сути, вы не можете назначить один и тот же экземпляр поведения нескольким компонентам. Если вы хотите улучшить удобочитаемость и удобство обслуживания, вы можете использовать:

public class HomePage extends MasterPage {
    public HomePage() {
        add(new TextField<String>("textField1", new Model<String>("Text Field 1")).add(newOnClickBehavior()));
        add(new TextField<String>("textField2", new Model<String>("Text Field 2")).add(newOnClickBehavior()));       
    }

    protected AjaxEventBehavior newOnClickBehavior() {
        return new AjaxEventBehavior("onClick") {
            private static final long serialVersionUID = 1L;

            @Override
            protected void onEvent(AjaxRequestTarget target) {
                // Same behavior of both the textField1 and textField2
            }
        };
    }
}
3 голосов
/ 08 июня 2011

Поведение Ajax может быть присоединено только к одному компоненту, потому что его URL обратного вызова зависит от компонента. В противном случае нажатие на ButtonB может выполнить ButtonA # onClick ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...