Я получаю исключение из Wicket 1.4.11 следующего содержания:
2010-11-03 17: 44: 51,971 [http-8080-1] ОШИБКА org.apache.wicket.RequestCycle - Метод onFormSubmitted для интерфейса org.apache.wicket.markup.html.form.IFormSubmitListener, нацеленного на компонент [ MarkupContainer [ID компонента = клиент]] выдал исключение
org.apache.wicket.WicketRuntimeException: метод onFormSubmitted интерфейса
org.apache.wicket.markup.html.form.IFormSubmitListener, нацеленный на компонент [MarkupContainer [Component id = customer]], вызвал исключение
в org.apache.wicket.RequestListenerInterface.invoke (RequestListenerInterface.java:193)
...
Вызывается: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод)
...
Причина: java.lang.IllegalStateException: этот метод может быть вызван только для компонента, который уже был добавлен к его родителю.
в org.apache.wicket.Component.replaceWith (Component.java:2804)
at no.magge.iumb.web.crm.customers.PrivateCustomerTab $ 1.onSubmit (PrivateCustomerTab.java:34)
в org.apache.wicket.markup.html.form.Form.delegateSubmit (Form.java:1565)
Это произошло, когда я щелкнул cancel_btn
формы на панели в панели вкладок в панели вкладок ... Вот код для cancel_btn
:
public class PrivateCustomerTab extends Panel {
private static final long serialVersionUID = 16L;
protected Panel getCurrentPanel() {
return this;
}
public PrivateCustomerTab(String id, long customerId, final Panel backPanel) {
super(id);
final PrivateCustomerForm form = new PrivateCustomerForm("customer", customerId) {
private static final long serialVersionUID = 4L;
@Override
protected void onSubmit() {
System.out.println("\n\n(formsubmit) HELLO THERE MY PARENT IS: " + getParent() + "\n\n");
if (customerId!=0) {
PrivateCustomerTab.this.replaceWith(new PrivateCustomerTab("panel", customerId, backPanel));
}
}
};
add(form);
Button cancelButton = new Button("cancel_btn", new ResourceModel("cancel")) {
private static final long serialVersionUID = 18L;
@Override
public void onSubmit() {
System.out.println("\n\n(cancelsubmit) HELLO THERE MY PARENT IS: " + getParent() + "\n\n");
if (backPanel!=null) {
// PrivateCustomerTab.this.replace(backPanel);
getCurrentPanel().replaceWith(new CustomerListTab("panel"));
}
}
};
cancelButton.setVisible(backPanel!=null);
form.add(cancelButton);
}
}
Я пытался разными способами получить текущую панель, которую я хочу заменить. Одним из способов является использование метода getCurrentPanel()
, который просто возвращает this
из класса панели. Еще один способ сделать PrivateCustomerTab.this.replaceWith(...)
, и я также попробовал getParent().getParent().replaceWith(...)
. Все это дает мне сообщение о том, что я не могу заменить то, что не добавлено к его родителю.
Я думаю, что я, должно быть, неправильно понимаю некоторую ключевую концепцию здесь. Возможно, формы обрабатываются до того, как моя панель добавлена в родительский, что означает, что я не могу заменить панель в cancel_btn
в onSubmit()
?
Я пытался найти свой путь в Google и что-то искать в моей копии Wicket in Action . Пожалуйста, помогите мне понять ... спасибо!