Wicket替换“仅对添加到父级的组件”

时间:2010-11-03 17:15:21

标签: java wicket

我从Wicket 1.4.11读到了一个例外:

  

2010-11-03 17:44:51,971 [http-8080-1] ERROR org.apache.wicket.RequestCycle - 方法onFormSubmitted接口org.apache.wicket.markup.html.form.IFormSubmitListener以组件为目标[ MarkupContainer [Component id = customer]]抛出异常
  org.apache.wicket.WicketRuntimeException:方法onFormSubmitted接口
  针对组件的org.apache.wicket.markup.html.form.IFormSubmitListener [MarkupContainer [Component id = customer]]引发异常        at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:193)
      ...
      引起:java.lang.reflect.InvocationTargetException        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      ...
      引发者: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)

当我在选项卡面板的tabbedpanel中单击面板中的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的{​​{1}}中的面板?

我在我的 Wicket in Action 副本中尝试使用Google搜索并查找有关它的内容。请帮助我理解......谢谢!

2 个答案:

答案 0 :(得分:1)

这不是关于寻找合适的小组。 这似乎没问题。 这三个电话似乎确实找到了同一个小组。

这是关于,面板本身是否被添加。为了替换自己的东西,组件需要询问父母,是否将其添加到。 然后它要求其父母忘记自己,并选择给定的组件作为孩子。

所以wicket基本上抱怨面板没有添加到任何组件中。

组件层次是否在平均时间内发生了变化?

答案 1 :(得分:0)

想出这一个 - 新手的错误(再次),我想。

onSubmit()的{​​{1}}之前调用表格cancel_btn会发生什么。由于第一个这些方法取代了面板,自然第二次尝试替换相同的面板时,它不会再添加到父面板中。

要解决此问题,我将表单onSubmit()代码移到了我的保存按钮onSubmit()中。通过执行此操作,只会调用一个onSubmit()方法,具体取决于单击的按钮。