Java 导叶更换“;仅在添加到父级的组件上;

Java 导叶更换“;仅在添加到父级的组件上;,java,wicket,Java,Wicket,我从Wicket 1.4.11中得到一个例外,内容如下: 2010-11-03 17:44:51971[http-8080-1]ERROR org.apache.wicket.RequestCycle-接口org.apache.wicket.markup.html.form.IFormSubmitListener的方法onFormSubmitted针对组件[MarkupContainer[component id=customer]]引发异常 org.apache.wicket.WicketRu

我从Wicket 1.4.11中得到一个例外,内容如下:

2010-11-03 17:44:51971[http-8080-1]ERROR org.apache.wicket.RequestCycle-接口org.apache.wicket.markup.html.form.IFormSubmitListener的方法onFormSubmitted针对组件[MarkupContainer[component id=customer]]引发异常
org.apache.wicket.WicketRuntimeException:接口的方法onFormSubmitted
目标为组件[MarkupContainer[component id=customer]]的org.apache.wicket.markup.html.form.IFormSubmitListener引发异常 位于org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:193)

原因:java.lang.reflect.InvocationTargetException 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)

原因:java.lang.IllegalStateException:只能对已添加到其父级的组件调用此方法。
位于org.apache.wicket.Component.replaceWith(Component.java:2804)
在no.magge.iumb.web.crm.customers.PrivateCustomerTab$1.onSubmit(PrivateCustomerTab.java:34)
位于org.apache.wicket.markup.html.form.form.delegateSubmit(form.java:1565)

这是在我单击选项卡面板中面板中窗体的
cancel\u 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()
方法,该方法仅从panel类返回
this
。另一种方法是执行
PrivateCustomerTab.this.replaceWith(…)
,我还尝试了
getParent().getParent().replaceWith(…)
。这些都给了我这样一个信息:我无法替换未添加到其父级的内容

我想我一定是误解了一些关键概念。可能表单是在我的面板添加到其父面板之前处理的,这意味着我无法在
cancel\u btn
onSubmit()中替换面板


我试着用谷歌搜索我的方式,并在我的《Wicket in Action》副本中寻找相关信息。请帮我理解。。。谢谢

这并不是要找到合适的面板。 看起来没问题。 这三个电话似乎找到了同一个面板

它是关于,是面板本身添加到的。若要将其自身替换为某个组件,需要询问父组件是否已添加到该组件。 然后,它让其父代忘记自己,选择给定的组件作为子组件

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


组件层次结构在同一时间发生了变化吗?

解决了这个问题——我猜是新手犯的错误(又一次)

发生的情况是,表单
onSubmit()
cancel\u btn
onSubmit()
之前被调用。由于这些方法第一次替换面板,自然,第二次尝试替换同一面板时,不再将其添加到父级


为了解决这个问题,我将表单
onSubmit()
code移动到我的保存按钮
onSubmit()
。通过执行此操作,仅调用了1个
onSubmit()
方法,具体取决于单击的按钮。

No,据我所知,层次结构不应该发生更改。我有一个链接,在这个PrivateCustomerTab面板中执行replaceWith()和replaces。我不会更改标记,也不会做任何事情来操纵标记与cancel_btn的onSubmit方法之间的层次结构。我明白你关于这个问题的观点,我的面板现在不知何故没有父对象。所以谢谢你…把这个标记为有用的。找到问题并在下面发布答案。再次感谢你的帮助,真的吗?多么奇怪:“Wicket首先调用按钮的
onSubmit
方法,然后(如果没有配置其他方法)调用表单的
onSubmit
方法。”-Wicket正在运行,第157odd页。我将再次进行调试。