Замена калитки "только для компонента, добавленного к родителю" - PullRequest
0 голосов
/ 03 ноября 2010

Я получаю исключение из 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 . Пожалуйста, помогите мне понять ... спасибо!

Ответы [ 2 ]

1 голос
/ 04 ноября 2010

Дело не в том, чтобы найти правую панель.Кажется, все в порядке.Все три вызова действительно находят одну и ту же панель.

Речь идет о том, куда была добавлена ​​сама панель.Чтобы заменить себя чем-то другим, компонент должен спросить родителя, куда он был добавлен.Затем он просит своего родителя забыть о себе и выбрать данный Компонент как дочерний.

Таким образом, wicket в основном жалуется, что панель не добавлена ​​ни в один компонент.среднее время?

0 голосов
/ 04 ноября 2010

Понял, что это одно - ошибка новичка (снова), я полагаю.

В результате получается, что формы onSubmit() вызываются до cancel_btn onSubmit().Так как первый из этих методов заменяет панель, естественно, во второй раз, когда кто-то пытается заменить эту же панель, он больше не добавляется к родительскому элементу.

Чтобы решить эту проблему, я переместил код форм onSubmit() в мое сохранение.кнопки onSubmit().При этом вызывается только 1 onSubmit() метод, в зависимости от того, какая кнопка была нажата.

...