[英]Displaying panel using ajax in apache wicket
I am learning wicket framework and while working with ajax I tried one example in which I want to display a panel with selected radio button's company name. 我正在学习wicket框架,并且在使用ajax时尝试了一个示例,该示例中要显示一个面板,其中包含选定的单选按钮的公司名称。 But while doing this I am getting some error. 但是在执行此操作时,出现了一些错误。 Here I mentioned all details from my coding: 在这里,我提到了编码中的所有细节:
Test.java Test.java
public class Test extends WebPage {
private static final List<String> companies = Arrays.asList(new String[] {"Google","Microsoft","Yahoo"});
private ArrayList<String> compSelected = new ArrayList<String>();
private Panel panel;
public Test(final PageParameters parameters) {
final RadioChoice<String> companyList =
new RadioChoice<String>("companyNames",new Model(compSelected),companies);
companyList.add(new AjaxFormChoiceComponentUpdatingBehavior() {
@Override
protected void onUpdate(AjaxRequestTarget target) {
if("Google".equals(companyList.getModelObject())){
panel = new Panel1("panel1","Google");
}
else if("Microsoft".equals(companyList.getModelObject())){
panel = new Panel1("panel1","Microsoft");
}
else{
panel = new Panel1("panel1","Yahoo");
}
panel.setOutputMarkupId(true);
target.addComponent(panel);
}});
Form<?> form = new Form<Void>("form");
add(form);
form.add(companyList);
form.add(panel);
this.add(form);
}
}
Test.html 的test.html
<form wicket:id="form">
<label><b>Company List:</b></label><br>
<span wicket:id="companyNames">radio button list will goes here</span><br>
<span wicket:id = "panel1" class="panel">panel goes here</span>
</form>
Panel1.java Panel1.java
@SuppressWarnings("serial")
public class Panel1 extends Panel{
public Panel1(String id,String cName) {
super(id);
add(new Label("msg", "selected company is:"+ cName));
}
}
Panel1.html Panel1.html
<body>
<wicket:panel>
<span wicket:id="msg">message goes here</span>
</wicket:panel>
</body>
WicketMessage: Can't instantiate page using constructor public demo.wicket.ajax.Test(org.apache.wicket.PageParameters) and argument Root cause:java.lang.IllegalArgumentException: argument child may not be null at org.apache.wicket.MarkupContainer.add(MarkupContainer.java:131) at demo.wicket.ajax.Test.(Test.java:46) at java.lang.reflect.Constructor.newInstance(Unknown Source) at org.apache.wicket.session.DefaultPageFactory.createPage(DefaultPageFactory.java:188) at org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:65) at org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.newPage(BookmarkablePageRequestTarget.java:299) at org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.getPage(BookmarkablePageRequestTarget.java:321) at org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.processEvents(BookmarkablePageRequestTarget.java:234) at org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents WicketMessage:无法使用构造函数public demo.wicket.ajax.Test(org.apache.wicket.PageParameters)和参数Root原因:java.lang.IllegalArgumentException实例化页面:子参数在org.apache.wicket上不能为null。 org.apache.wicket.session.DefaultPageFactory上的demo.wicket.ajax.Test。(Test.java:46)上的MarkupContainer.add(MarkupContainer.java:131)在java.lang.reflect.Constructor.newInstance(Unknown Source)上org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:65)的.createPage(DefaultPageFactory.java:188)org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.newPage(BookmarkablePageRequestTarget.java:299) )于org.org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.processEvents(BookmarkablePageRequestTarget.java:234)于org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.getPage(BookmarkablePageRequestTarget.java:321)处。 apache.wicket.request.AbstractRequestCycleProcessor.processEvents (AbstractRequestCycleProcessor.java:92) at org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1250) at org.apache.wicket.RequestCycle.step(RequestCycle.java:1329) at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1428) at org.apache.wicket.RequestCycle.request(RequestCycle.java:545) at org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:468) at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:301) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve. (AbstractRequestCycleProcessor.java:92),位于org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1250),位于org.apache.wicket.RequestCycle.step(RequestCycle.java:1329),位于org.apache.wicket.RequestCycle。在org.apache.wicket.RequestCycle.request(RequestCycle.java:545)在org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:468)的步骤(RequestCycle.java:1428) org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)上的.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:301)在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain .java:208)位于org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)位于org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)位于org.apache.catalina。 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve。)中的authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503) java:170) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Unknown Source) java:170)位于org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)位于org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)位于org.apache.catalina.core位于org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)的org.apache.coyote.http11上的.StandardEngineValve.invoke(StandardEngineValve.java:116) org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run(JIoEndpoint.java:314)上的org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:611)在java.util.concurrent.ThreadPoolExecutor $位于org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)的java.util.concurrent.ThreadPoolExecutor $ Worker.run(未知源)的java.lang处的Worker.runTask(未知源) .Thread.run(未知来源)
I am not sure what I did wrong here. 我不确定我在这里做错了什么。 can someone please help me to figure it out? 有人可以帮我弄清楚吗?
The problem is form.add(panel);
问题是form.add(panel);
. 。 panel
is null at that time. panel
当时为null。 You initialize it in #onUpdate()
but it is executed only after a click(?) on the radio buttons. 您可以在#onUpdate()
中#onUpdate()
初始化,但只有在单选按钮上单击(?)后才能执行。
Solution: 解:
Change panel
type to WebMarkupContainer
and initialize it in the page's constructor. 将panel
类型更改为WebMarkupContainer
,然后在页面的构造函数中对其进行初始化。 Call panel.setOutputMarkupId(true)
also in the constructor so the <span wicket:id="panel1"...>
has an id
in the rendered HTML and being able to be referenced later with JS to replace/update it. 在构造函数中也调用panel.setOutputMarkupId(true)
,以便<span wicket:id="panel1"...>
在呈现的HTML中具有一个id
,并且以后可以用JS引用以替换/更新它。 In #onUpdate()
use something like panel = panel.replaceWith(new Panel1(panel.getId(), choice.getModelObject())); target.add(panel);
在#onUpdate()
使用诸如panel = panel.replaceWith(new Panel1(panel.getId(), choice.getModelObject())); target.add(panel);
panel = panel.replaceWith(new Panel1(panel.getId(), choice.getModelObject())); target.add(panel);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.