在 wicket 中使用 replacewith 替换面板

replacing panels using replacewith in wicket

您好,我正在尝试在两个面板之间导航。我的代码有一个条件,如果为假,它必须返回到带有参数的实际面板,然后在反馈面板中打印错误消息。

条件为真时出现此错误。

SearchInnerPanel.java:

 (TabPanel1.this.getParent()).getParent().replaceWith(new JobDetails("innerpanel", params));

JobDetails.java:

list = DBUtils.retrieve(params.get("jobnum").toString());

            if (list.size() == 0) {
                PageParameters params1 = new PageParameters();
                params1.add("jobnum", jnum);

                AgileJobDetails.this.replaceWith(new SearchInnerPanel("innerpanel",  params1));
            }

错误日志:

org.apache.wicket.WicketRuntimeException: Method onFormSubmitted of interface org.apache.wicket.markup.html.form.IFormSubmitListener targeted at [Form [Component id = jobnumform]] on component [Form [Component id = jobnumform]] threw an exception
    at org.apache.wicket.RequestListenerInterface.internalInvoke(RequestListenerInterface.java:268)
    at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:216)
    at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.invokeListener(ListenerInterfaceRequestHandler.java:243)
    at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.respond(ListenerInterfaceRequestHandler.java:236)
    at org.apache.wicket.core.request.handler.RequestSettingRequestHandler.respond(RequestSettingRequestHandler.java:78)
    at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:862)
    at org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64)
    at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:261)
    at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:218)
    at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:289)
    at org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:259)
    at org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:201)
    at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:282)
    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:610)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    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:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2441)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2430)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.wicket.RequestListenerInterface.internalInvoke(RequestListenerInterface.java:258)
    ... 29 more
Caused by: java.lang.IllegalStateException: This method can only be called on a component that has already been added to its parent.
    at org.apache.wicket.Component.replaceWith(Component.java:2754)
    at com.CCC.aaa.des.JobDetails.<init>(JobDetails.java:40)
    at com.CCC.aaa.des.SearchInnerPanel$TabPanel1.onSubmit(SearchInnerPanel.java:130)
    at org.apache.wicket.markup.html.form.Form.delegateSubmit(Form.java:1266)
    at org.apache.wicket.markup.html.form.Form.process(Form.java:938)
    at org.apache.wicket.markup.html.form.Form.onFormSubmitted(Form.java:770)
    at org.apache.wicket.markup.html.form.Form.onFormSubmitted(Form.java:703)
    ... 34 more

请建议如何重定向到实际面板。 谢谢

将上面JobDetails 的代码片段从构造函数移至#onInitialize() 方法。在那里它已经被添加到它的父级并且可以替换它。