简体   繁体   English

在Apache wicket中使用Ajax显示面板

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM