java.lang.IllegalStateException: this kind of handler cannot be attached to multiple components
This the exception:
java.lang.IllegalStateException: this kind of handler cannot be attached to开发者_StackOverflow中文版 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)
thrown by the following code:
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));
}
}
But this is okay:
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
}
}));
}
}
Why?
Thank you.
Added:
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
}
}
}
Basically, you can't assign the same instance of a Behavior to multiple components. If you want to improve readability and maintainability, you can use:
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
}
};
}
}
An Ajax behavior can be attached to just one component because its callback url depends on the component. Otherwise clicking on ButtonB may execute ButtonA#onClick()
精彩评论