我从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搜索并查找有关它的内容。请帮助我理解......谢谢!
答案 0 :(得分:1)
这不是关于寻找合适的小组。 这似乎没问题。 这三个电话似乎确实找到了同一个小组。
这是关于,面板本身是否被添加。为了替换自己的东西,组件需要询问父母,是否将其添加到。 然后它要求其父母忘记自己,并选择给定的组件作为孩子。
所以wicket基本上抱怨面板没有添加到任何组件中。
组件层次是否在平均时间内发生了变化?
答案 1 :(得分:0)
想出这一个 - 新手的错误(再次),我想。
在onSubmit()
的{{1}}之前调用表格cancel_btn
会发生什么。由于第一个这些方法取代了面板,自然第二次尝试替换相同的面板时,它不会再添加到父面板中。
要解决此问题,我将表单onSubmit()
代码移到了我的保存按钮onSubmit()
中。通过执行此操作,只会调用一个onSubmit()
方法,具体取决于单击的按钮。