the "workaround" is quiet easy class mypage extends webpage { onbeforerender() { if (get("panel1")==null) { add(newPanel1("panel1")); } super.onbeforerender(); } }
-igor On Thu, Mar 20, 2008 at 2:12 AM, Sebastiaan van Erk <[EMAIL PROTECTED]> wrote: > Gerolf Seitz wrote: > > you can provide factory methods in your base page like > > protected abstract Component newHeader(String id, IModel model); > > > > in the constructor of base page do: > > add(newHeader("header", someModelOrNull)); > > > > and just override/implement the factory method in your concrete page > > classes. > > > > hth, > > Gerolf > > > I'll be so happy when multiple child is implemented, because I really > think this is an anti-pattern. > > Basically, in the constructor of the base page you call an overridable > method, which is terrible. For example you have in your subclass: > > public class MySubClass extends MyBaseClass { > > // my fields > public int answer = 42; > > public MySubClass(int suppliedAnswer) { > // implicit (or explicity call to super) > super(); > > // init class state and establish class invariants > // this stuff could be really complicated! > if (suppliedAnswer != -1) { > answer = suppliedAnswer; > } > } > > @Override > public Component getUniverseComponent(String id) { > // create universe component using state of this class > // the structure of this component could depend on this > // the component could even depend on constructor > // args that the base class knows nothing about (as > // is the case now). > if (answer == 42) { > return new HHGTGPanel(id); > } > return new Label(id, String.valueOf(answer)); > } > > } > > The problem is that getUniverseComponent gets called from the base class > before the constructor of the subclass gets evaluated. :-( This means > that the = 42 assignment has not been done yet, nor the override of the > value with the value from the constructor arg. The (partial) workaround > I've used (a special private init method and initialized flag) is just > plain ugly (and partial, since you still can't use your constructor args). > > Regards, > Sebastiaan > > > > > > > > On Thu, Mar 20, 2008 at 9:25 AM, Cristi Manole <[EMAIL PROTECTED]> > > wrote: > > > >> Hello, > >> > >> I've searched the web and I see there are a lot of hits for what I'm > >> looking > >> for but I cannot quite pinpoint the perfect solution (easiest) for this > >> simple thing. > >> > >> What I need is to be able to "extend" a base page and put into some places > >> some extra panels. I designed the places in the base page. > >> > >> For only one panel, I can use <wicket:child> tag. If I need more than one > >> panel inserted, how do I do that? > >> > >> Thanks, > >> Cristi Manole > >> > > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]