Thanks for your help, everything works now!
--
regards
Paweł Czerwiński
"Andrew Robinson" <[EMAIL PROTECTED]> wrote on 2007-08-09
17:04:25:
> You have a few problems with that code.
>
> 1) You should set the parent of the component, this causes issues with
> many components
> 2) You should mark the component as transient, which should be done
> for components that will not be saved into the component tree
> 3) You should set an ID of the component, which should be done for all
> components
> 4) Your component is not preserved, so you have to perform the decode
yourself
> 5) Even with the decode, you have to be careful as the event will be
> tied to that component, which is temporary.
> 6) You shouldn't call encodeChildren on a component without first
> checking the getRendersChildren flag of the component
>
> Try this:
>
> public class MyRenderer extends Renderer {
> public void decode(FacesContext context, UIComponent component) {
> if (!component.isRendered()) {
> return;
> }
> createButton(ctx, component).decode(context);
> }
>
> public void encodeBegin(FacesContext ctx, UIComponent component) {
> if (!component.isRendered()) {
> return;
> }
> HtmlCommandButton b = createButton(ctx, component);
> b.setValue("Click me");
> RendererUtils.renderChild(ctx, component);
> }
>
> private HtmlCommandButton createButton(FacesContext ctx,
> UIComponent component) {
> HtmlCommandButton b = (HtmlCommandButton)ctx.getApplication()
> .createComponent(HtmlCommandButton.COMPONENT_TYPE);
> b.setId(ctx.getViewHandler().getViewRoot().createUniqueId());
> b.setTransient(true);
> b.setParent(component);
> return b;
> }
> }
>
> Since the FacesEvent has a reference to its component, the event
> should work fine. If you need to do anything special on one of those
> events, you will need to override your component's queueEvent method,
> so you can trap events being queued by the button during the decoding.
>
> -Andrew
>
>
> On 8/9/07, [EMAIL PROTECTED]
> <[EMAIL PROTECTED]> wrote:
> >
> > Hi,
> > I'm developing some simple custom component, and I'm facing a problem
I
> > cannot resolve and understand, so I will really appreciate any help.
> >
> > I have this piece of code:
> >
> > public void encodeBegin(FacesContext c) throws IOException {
> > HtmlCommandButton b = (HtmlCommandButton)
> >
context.getApplication().createComponent(HtmlCommandButton.COMPONENT_TYPE);
> > b.setValue("Click me");
> > b.encodeBegin(context);
> > b.encodeChildren(context);
> > b.encodeEnd(context);
> > }
> >
> > And with above code everything is great, the button renders and when I
click
> > it, the
> >
> > public void decode(FacesContext context)
> >
> > method is called... But. If I change HtmlCommandButton to
HtmlCommandLink
> > something strange happens. The link is created and renders as well,
> > but when I click it, the decode method is not called at all.
> >
> > Is there any difference between handlig those two components?
> > Thanks in advance!
> >
> > --
> > greetings
> > Paweł Czerwiński
> >
> >