completely untrue. see my sample that works with a regular tabbed panel.

-igor

On Thu, Jul 30, 2009 at 3:06 AM, Gajo Csaba<[email protected]> wrote:
> Hi Iain,
>
> I solved the problem thanks to martin-g from ##wicket. Seems like the
> problem was I was using a non-ajax tabbed panel with an ajax button. When I
> switched to an ajax panel, it worked great.
> I've also tried using a non-ajax tabbed panel with a non-ajax button like
> you suggested, and it also seems to work.
>
> Looks like the only problem here is that you shouldn't mix ajax components
> with non-ajax ones.
>
> Regards,
> Csaba
>
>
> Iain Reddick wrote:
>>
>> Surely this is what you want for a non-ajax solution:
>>
>> class MyPage extends Page {
>>  private TabbedPanel tabPanel;
>>  ...
>>  public MyPage() {
>>   tabPanel = new TabPanel(...);
>>   add( tabPanel );
>>   ...
>>   confirmBtn = new Button("confirm") {
>>     private static final long serialVersionUID = 1L;
>>
>>     @Override
>>     public void onSubmit() {
>>       tabPanel.setSelectedTab(0);
>>     }
>>   };
>>   add( confirmBtn );
>>  }
>> }
>>
>> And for an ajax solution, just add tabPanel to the ajax request in the
>> submit handler?
>>
>> Sorry if this isn't right, but I don't see what the issue is.
>>
>> Gajo Csaba wrote:
>>>
>>> That may be true Igor, but there doesn't seem to be any other solution to
>>> make this work:
>>>
>>> confirmBtn = new Button("confirm") {
>>>   private static final long serialVersionUID = 1L;
>>>   @Override
>>>   public void onSubmit() {
>>>       Page page = getPage();
>>>       TabbedPanel tabPanel = ((HomePage)getWebPage()).getTabbedPanel();
>>>                    tabPanel.setSelectedTab(0);
>>>       setResponsePage(page);
>>>   }
>>> };
>>>
>>> I cannot repaint the tabPanel (either with render() or
>>> renderComponent()), cannot repaint the whole page, cannot go with Linda's
>>> suggestion because even after Martin's fix it still generates an error. I
>>> just want to set the tabbedpanel's selected tab to be #0. It's not that
>>> complicated. In Swing, I would write: tabPanel.setSelectedTab(0); and that
>>> would be it.
>>>
>>> Now I'm not very critical about how software systems are constructed, and
>>> don't care if some features may cause minor side-effects, or cause the
>>> programmer to write a bit hacky code. But having the setSelectedTab() method
>>> detach the page for no apparent reason and without any warning is as bad as
>>> having a goto command in a programming language. "Side effects" are one of
>>> the first thing that you learn in college, and why you should avoid them at
>>> all cost. The documentation for the setSelectedTab() says "sets the selected
>>> tab". What it's missing is a big warning sign "WARNING!!!! IT DETACHES THE
>>> PAGE!!!! WILL CAUSE UNRELATED ERROR MESSAGES!!!"
>>>
>>> So what is your suggestion Igor? How should I use the framework properly?
>>>
>>> Regards,
>>> Csaba
>>>
>>>
>>> Igor Vaynberg wrote:
>>>>
>>>> of course there is no reason to use an ajax link if all you are going
>>>> to do is repaint the entire page anyways...
>>>>
>>>> also code like this: setresponsepage(getpage()) is always suspect. by
>>>> default wicket repaints the same page so there is no need to call
>>>> this. when inside ajax you should add components you want repainted to
>>>> the request target that is passed in to you.
>>>>
>>>> setresponsepage should only be used when actually going to a different
>>>> page. you are not using the framework properly...
>>>>
>>>> -igor
>>>>
>>>> 2009/7/29 Martin Makundi <[email protected]>:
>>>>
>>>>>
>>>>> 1.
>>>>>
>>>>> You can fix linda's suggestion by calling setOutputMarkupId(true) on
>>>>> your tabbedpanel.
>>>>>
>>>>> 2. The reason for:
>>>>>
>>>>> 10:42:27 ERROR [RequestCycle] - No Page found for component
>>>>> [MarkupContainer [Component id = panel]]
>>>>> java.lang.IllegalStateException: No Page found for component
>>>>> [MarkupContainer [Component id = panel]]
>>>>>     at org.apache.wicket.Component.getPage(Component.java:1729)
>>>>>
>>>>> Is that you just called setSelectedTab() which DISCONNECTS the current
>>>>> tab from the page hierarcy. Try getting the page before that:
>>>>> onClick() {
>>>>>  Page page = getPage();
>>>>>  tabbedPanel.setSelectedTab(0);
>>>>>  setREsponsePage(page);
>>>>> }
>>>>>
>>>>>
>>>>> **
>>>>> Martin
>>>>>
>>>>>
>>>>> **
>>>>> Martin
>>>>>
>>>>> 2009/7/29 Gajo Csaba <[email protected]>:
>>>>>
>>>>>>
>>>>>> Hmm there's something very wrong here...
>>>>>>
>>>>>> I try to refresh the page like this:
>>>>>> setResponsePage(getPage());
>>>>>>
>>>>>> When this is the only action, the current page is refreshed. When I
>>>>>> write
>>>>>> setSelectedTab(0) above it, I get an error.
>>>>>>
>>>>>> 10:42:27 ERROR [RequestCycle] - No Page found for component
>>>>>> [MarkupContainer
>>>>>> [Component id = panel]]
>>>>>> java.lang.IllegalStateException: No Page found for component
>>>>>> [MarkupContainer [Component id = panel]]
>>>>>>      at org.apache.wicket.Component.getPage(Component.java:1729)
>>>>>>      at
>>>>>>
>>>>>> si.irose.iprojekti.treeview.TreeViewPanel.deleteBtnClick(TreeViewPanel.java:160)
>>>>>>      at
>>>>>>
>>>>>> si.irose.iprojekti.treeview.TreeViewPanel.access$200(TreeViewPanel.java:45)
>>>>>>      at
>>>>>>
>>>>>> si.irose.iprojekti.treeview.TreeViewPanel$3.onSubmit(TreeViewPanel.java:95)
>>>>>>      at
>>>>>>
>>>>>> org.apache.wicket.ajax.markup.html.form.AjaxFallbackButton$1.onSubmit(AjaxFallbackButton.java:74)
>>>>>>      at
>>>>>>
>>>>>> org.apache.wicket.ajax.form.AjaxFormSubmitBehavior.onEvent(AjaxFormSubmitBehavior.java:140)
>>>>>>      at
>>>>>>
>>>>>> org.apache.wicket.ajax.AjaxEventBehavior.respond(AjaxEventBehavior.java:166)
>>>>>>      at
>>>>>>
>>>>>> org.apache.wicket.ajax.AbstractDefaultAjaxBehavior.onRequest(AbstractDefaultAjaxBehavior.java:299)
>>>>>>      at
>>>>>>
>>>>>> org.apache.wicket.request.target.component.listener.BehaviorRequestTarget.processEvents(BehaviorRequestTarget.java:105)
>>>>>>      at
>>>>>>
>>>>>> org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents(AbstractRequestCycleProcessor.java:92)
>>>>>>      at
>>>>>>
>>>>>> org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1192)
>>>>>>      at org.apache.wicket.RequestCycle.step(RequestCycle.java:1271)
>>>>>>      at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1370)
>>>>>>      at org.apache.wicket.RequestCycle.request(RequestCycle.java:501)
>>>>>>      at
>>>>>>
>>>>>> org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:455)
>>>>>>      at
>>>>>>
>>>>>> org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:288)
>>>>>>      at
>>>>>>
>>>>>> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
>>>>>>      at
>>>>>>
>>>>>> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>>>>>>      at
>>>>>>
>>>>>> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
>>>>>>      at
>>>>>>
>>>>>> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
>>>>>>      at
>>>>>>
>>>>>> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
>>>>>>      at
>>>>>>
>>>>>> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
>>>>>>      at
>>>>>>
>>>>>> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
>>>>>>      at
>>>>>>
>>>>>> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
>>>>>>      at
>>>>>>
>>>>>> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
>>>>>>      at
>>>>>>
>>>>>> org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
>>>>>>      at
>>>>>>
>>>>>> org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
>>>>>>      at java.lang.Thread.run(Thread.java:619)
>>>>>>
>>>>>>
>>>>>> I've also tried with render() and renderComponent(), on a page and on
>>>>>> the
>>>>>> tabPanel level...
>>>>>>
>>>>>> Linda's suggestion also generates an error, albeit a different one.
>>>>>> "innertabs" is found in HomePage.html, which looks like this:
>>>>>>
>>>>>> <html>
>>>>>> <head>
>>>>>> </head>
>>>>>> <body>
>>>>>>  <wicket:extend>
>>>>>>      <div wicket:id="innertabs" class="innertabpanel">[inner tabbed
>>>>>> panel
>>>>>> will be here]</div>
>>>>>>  </wicket:extend>
>>>>>> </body>
>>>>>> </html>
>>>>>>
>>>>>> The tabbed panel is the "innertabs". The generated exception is:
>>>>>>
>>>>>> java.lang.IllegalArgumentException: cannot update component that does
>>>>>> not
>>>>>> have setOutputMarkupId property set to true. Component:
>>>>>> [MarkupContainer
>>>>>> [Component id = innertabs]]
>>>>>>   at
>>>>>>
>>>>>> org.apache.wicket.ajax.AjaxRequestTarget.addComponent(AjaxRequestTarget.java:345)
>>>>>>   at
>>>>>>
>>>>>> si.irose.iprojekti.treeview.TreeViewPanel.deleteBtnClick(TreeViewPanel.java:161)
>>>>>>   at
>>>>>>
>>>>>> si.irose.iprojekti.treeview.TreeViewPanel.access$200(TreeViewPanel.java:45)
>>>>>>   at
>>>>>>
>>>>>> si.irose.iprojekti.treeview.TreeViewPanel$3.onSubmit(TreeViewPanel.java:95)
>>>>>>   at
>>>>>>
>>>>>> org.apache.wicket.ajax.markup.html.form.AjaxFallbackButton$1.onSubmit(AjaxFallbackButton.java:74)
>>>>>>   at
>>>>>>
>>>>>> org.apache.wicket.ajax.form.AjaxFormSubmitBehavior.onEvent(AjaxFormSubmitBehavior.java:140)
>>>>>>   at
>>>>>>
>>>>>> org.apache.wicket.ajax.AjaxEventBehavior.respond(AjaxEventBehavior.java:166)
>>>>>>   at
>>>>>>
>>>>>> org.apache.wicket.ajax.AbstractDefaultAjaxBehavior.onRequest(AbstractDefaultAjaxBehavior.java:299)
>>>>>>   at
>>>>>>
>>>>>> org.apache.wicket.request.target.component.listener.BehaviorRequestTarget.processEvents(BehaviorRequestTarget.java:105)
>>>>>>   at
>>>>>>
>>>>>> org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents(AbstractRequestCycleProcessor.java:92)
>>>>>>   at
>>>>>>
>>>>>> org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1192)
>>>>>>   at org.apache.wicket.RequestCycle.step(RequestCycle.java:1271)
>>>>>>   at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1370)
>>>>>>   at org.apache.wicket.RequestCycle.request(RequestCycle.java:501)
>>>>>>   at
>>>>>>
>>>>>> org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:455)
>>>>>>   at
>>>>>>
>>>>>> org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:288)
>>>>>>   at
>>>>>>
>>>>>> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
>>>>>>   at
>>>>>>
>>>>>> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>>>>>>   at
>>>>>>
>>>>>> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
>>>>>>   at
>>>>>>
>>>>>> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
>>>>>>   at
>>>>>>
>>>>>> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
>>>>>>   at
>>>>>>
>>>>>> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
>>>>>>   at
>>>>>>
>>>>>> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
>>>>>>   at
>>>>>>
>>>>>> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
>>>>>>   at
>>>>>>
>>>>>> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
>>>>>>   at
>>>>>>
>>>>>> org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
>>>>>>   at
>>>>>>
>>>>>> org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
>>>>>>   at java.lang.Thread.run(Thread.java:619)
>>>>>>
>>>>>>
>>>>>> getPage().addOrReplace(tabPanel); also generates some third error...
>>>>>>
>>>>>> tabPanel.addOrReplace(tabPanel); generates an error saying I can't
>>>>>> replace a
>>>>>> component with itself :)
>>>>>>
>>>>>> Writing the complete URL
>>>>>>
>>>>>> ?wicket:interface=:2:innertabs:tabs-container:tabs:0:link:1:ILinkListener::
>>>>>> seems to be the only suggestion which actually works for now.
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> Martin Makundi wrote:
>>>>>>
>>>>>>>
>>>>>>> Ah.. do you repaint the page after your ajax button call?
>>>>>>>
>>>>>>> **
>>>>>>> Martin
>>>>>>>
>>>>>>> 2009/7/29 Gajo Csaba <[email protected]>:
>>>>>>>
>>>>>>>
>>>>>>>>
>>>>>>>> This is what the link does in Wicket's source code:
>>>>>>>>
>>>>>>>> new Link(linkId) {
>>>>>>>>         private static final long serialVersionUID = 1L;
>>>>>>>>
>>>>>>>>         @Override
>>>>>>>>         public void onClick() {
>>>>>>>>             setSelectedTab(index);   // <-----
>>>>>>>>         }
>>>>>>>>     };
>>>>>>>>
>>>>>>>>
>>>>>>>> This is my code:
>>>>>>>>  /** Click on the Delete button */
>>>>>>>>  private void deleteBtnClick(AjaxRequestTarget target, Form<?> form)
>>>>>>>> {
>>>>>>>>     TabbedPanel tabPanel =
>>>>>>>> ((HomePage)getWebPage()).getTabbedPanel();
>>>>>>>>     tabPanel.setSelectedTab(0);      // <-------
>>>>>>>>  }
>>>>>>>>
>>>>>>>> Wicket's code works, mine doesn't. I've tried with a button and an
>>>>>>>> ajaxfallbacklink... Maybe I really should redirect to the same page
>>>>>>>> with
>>>>>>>> another parameter, like you did.
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>> ---------------------------------------------------------------------
>>>>>>> To unsubscribe, e-mail: [email protected]
>>>>>>> For additional commands, e-mail: [email protected]
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>> ---------------------------------------------------------------------
>>>>>> To unsubscribe, e-mail: [email protected]
>>>>>> For additional commands, e-mail: [email protected]
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: [email protected]
>>>>> For additional commands, e-mail: [email protected]
>>>>>
>>>>>
>>>>>
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: [email protected]
>>>> For additional commands, e-mail: [email protected]
>>>>
>>>>
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: [email protected]
>>> For additional commands, e-mail: [email protected]
>>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [email protected]
>> For additional commands, e-mail: [email protected]
>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to