Wicket Palette 継承

Wicket extension Palette ヘッダタイトル、ボタン画像、スタイルシート、そんなに Override が多いなら
継承クラス、CSS ,HTML ,ボタン画像、これら1つのパッケージに用意した方が良さそうである。

import java.util.Collection;
import java.util.List;
import org.apache.wicket.Component;
import org.apache.wicket.ResourceReference;
import org.apache.wicket.extensions.markup.html.form.palette.Palette;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.IChoiceRenderer;
import org.apache.wicket.markup.html.image.Image;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.ResourceModel;
/**
 * Wicket extension Palette の継承、ボタン、スタイルシート、タイトルの編集
 */

public class UPalette<T> extends Palette<T>{
   private String availableHeader;
   private String selectedHeader;
   public UPalette(String id,IModel<? extends Collection<? extends T>> choicesModel
                  ,IChoiceRenderer<T> choiceRenderer,int rows,boolean arrowOrder){
      super(id,choicesModel,choiceRenderer,rows,arrowOrder);
      add(getHeadTitleLabelComponent());
   }
   public UPalette(String id,IModel<List<T>> model
                  ,IModel<? extends Collection<? extends T>> choicesModel
                  ,IChoiceRenderer<T> choiceRenderer,int rows,boolean arrowOrder){
      super(id,model,choicesModel,choiceRenderer,rows,arrowOrder);
      add(getHeadTitleLabelComponent());
   }
   public UPalette(String id,IModel<List<T>> model
                  ,IModel<? extends Collection<? extends T>> choicesModel
                  ,IChoiceRenderer<T> choiceRenderer,int rows,boolean arrowOrder
                  ,String availableHeader,String selectedHeader){
      super(id,model,choicesModel,choiceRenderer,rows,arrowOrder);
      add(getHeadTitleLabelComponent());
      this.availableHeader = availableHeader;
      this.selectedHeader = selectedHeader;
   }

   @Override
   protected Component newAvailableHeader(String componentId){
      return new Label(componentId
,new ResourceModel("palette.available",getAvailableHeader())){
         @Override
         public boolean isVisible(){
            return getAvailableHeader()==null ? false : true;
         }
      };
   }
   @Override
   protected Component newSelectedHeader(String componentId){
      return new Label(componentId,new ResourceModel("palette.selected"
,getSelectedHeader())){
         @Override
         public boolean isVisible(){
            return getSelectedHeader()==null ? false : true;
         }
      };
   }
   @Override
   protected Component newAddComponent(){
      return (new WebMarkupContainer("addButton"){
         @Override
         protected void onComponentTag(ComponentTag tag){
            super.onComponentTag(tag);
            tag.getAttributes().put("onclick", getAddOnClickJS());
         }
      }).add(new Component{new Image("image"
,new ResourceReference(UPalette.class,"add.gif"))});
   }
   @Override
   protected Component newRemoveComponent(){
      return (new WebMarkupContainer("removeButton"){
         @Override
         protected void onComponentTag(ComponentTag tag){
            super.onComponentTag(tag);
            tag.getAttributes().put("onclick", getRemoveOnClickJS());
         }
      }).add(new Component
{new Image("image"
,new ResourceReference(UPalette.class,"remove.gif"))});
   }
   @Override
   protected Component newUpComponent(){
      return (new WebMarkupContainer("moveUpButton"){
         @Override
         protected void onComponentTag(ComponentTag tag){
            super.onComponentTag(tag);
            tag.getAttributes().put("onclick", getUpOnClickJS());
         }
      }).add(new Component{new Image("image"
,new ResourceReference(UPalette.class,"up.gif"))});
   }
   @Override
   protected Component newDownComponent(){
      return (new WebMarkupContainer("moveDownButton"){
         @Override
         protected void onComponentTag(ComponentTag tag){
            super.onComponentTag(tag);
            tag.getAttributes().put("onclick", getDownOnClickJS());
         }
      }).add(new Component
{new Image("image"
,new ResourceReference(UPalette.class,"down.gif"))});
   }
   @Override
   protected ResourceReference getCSS(){
      return new ResourceReference(UPalette.class,"upalette.css");
   }
   protected Component getHeadTitleLabelComponent(){
      return new Label(getHeadTitleId(),"&nbsp;").setEscapeModelStrings(false);
   }
   protected String getHeadTitleId(){
      return "title";
   }
   protected String getAvailableHeader(){
      return this.availableHeader;
   }
   protected String getSelectedHeader(){
      return this.selectedHeader;
   }

}

------------ UPalette.html の wicket:panel -------------
<wicket:panel>
<input type="hidden" wicket:id="recorder"/>
<table cellspacing="0" cellpadding="2" class="palette">
   <thead>
      <tr class="palette_head">
         <th wicket:id="title" colspan="3" class="palette_head">[Palette]</th>
      </tr>
   </thead>
   <tr>
      <td wicket:id="availableHeader"
 class="header headerAvailable">[available header]</td>
      <td> </td>
      <td wicket:id="selectedHeader"
 class="header headerSelected">[selected header]</td>
   </tr>
   <tr>
      <td class="pane choices">
         <select wicket:id="choices" class="choicesSelect" size="10"></select>
      </td>
      <td class="buttons">
         <button type="button" wicket:id="addButton"
 class="button add"><img wicket:id="image" src="add.gif"/></button><br/>
         <button type="button" wicket:id="removeButton"
 class="button remove"><img wicket:id="image" src="remove.gif"/></button><br/>
         <button type="button" wicket:id="moveUpButton"
 class="button up"><img wicket:id="image" src="up.gif"/></button><br/>
         <button type="button" wicket:id="moveDownButton"
 class="button down"><img wicket:id="image" src="down.gif"/></button><br/>
      </td>
      <td class="pane selection">
         <select class="selectionSelect" wicket:id="selection" size="10"></select>
      </td>
   </tr>
</table>
</wicket:panel>