2015-08-24 1 views
3

Dans tout composant de répéteur Wicket, quel est le schéma courant pour utiliser différentes classes de composants en fonction de la classe d'objets du modèle? Mon approche actuelle est quelque chose comme ça, mais je crois qu'il ya une façon meilleure solution:Comment gérer un motif composite d'une manière Wicket-ish?

BaseClass 
|- AClass 
|- BClass 
`- CClass 


protected void populateItem(Item<BaseClass> item) { 
    BaseClass obj = item.getModelObject(); 
    if (obj instanceof AClass) { 
     item.add(new APanel("content", Model.of((AClass) obj))); 
    } else if (obj instanceof BClass) { 
     item.add(new BPanel("content", Model.of((BClass) obj))); 
    } else if (obj instanceof CClass) { 
     item.add(new CPanel("content", Model.of((CClass) obj))); 
    } 
} 

Répondre

0

Dans une petite solution que je vais peut-être utiliser votre méthode (peut-être avec Map<dataClass,guiClass> mais pas trop important). Si des chemins différents nécessitent un balisage différent, utilisez des fragments de guichet.

<html xmlns:wicket="http://wicket.sourceforge.net/"> 
<wicket:panel> 
    <table> 
     <tr wicket:id="lista"> 

      <td><span wicket:id="label"></span></td> 
      <td><span wicket:id="dynamicValue"></span></td> 
     </tr> 

    </table> 
    <wicket:fragment wicket:id="memoValue"> 
     <textarea wicket:id="value" cols="100" rows="15"></textarea> 
    </wicket:fragment> 

    <wicket:fragment wicket:id="smallValue"> 
     <input wicket:id="value"></input> 
    </wicket:fragment> 

    <wicket:fragment wicket:id="comboValue"> 
     <select wicket:id="value"></select> 
    </wicket:fragment> 

</wicket:panel> 
</html> 

et

@Override 
      protected void populateItem(ListItem<IFieldDescription> item) { 
       final IFieldDescription poz = item.getModelObject(); 
       System.out.println("Start:" + poz.getLabel()); 

       item.add(new Label("label", poz.getLabel())); 
       if (poz instanceof IVirtualField) { 
        Fragment fragS = new Fragment("dynamicValue", "smallValue", ValuesPanel.this); 
        TextField<String> tf; 
        fragS.add(tf = new TextField<String>("value", new Model<String>("pole wirtualne"))); 
        tf.setEnabled(false); 
        item.add(fragS); 
        return; 
       } 

       if (poz instanceof IRelationFieldDescription) { 
        IRelationFieldDescription rel = (IRelationFieldDescription)poz; 
        Fragment fragS = new Fragment("dynamicValue", "comboValue", ValuesPanel.this); 
        SingleFieldModel<Integer> model = new SingleFieldModel<Integer>(detachableRVModel, poz); 
        RelationDropDownChoice tf; 
        tf = new RelationDropDownChoice("value", model,new DetachableRTypeModel(rel.getSlave())); 
        fragS.add(tf); 
        //tf.setEnabled(false); 
        item.add(fragS); 
        return; 
       } 

       if (poz instanceof MemoField) { 
        Fragment fragM = new Fragment("dynamicValue", "memoValue", ValuesPanel.this); 
        SingleFieldModel<String> model = new SingleFieldModel<String>(detachableRVModel, poz); 
        fragM.add(new TextArea<String>("value", model)); 
        // IModel<Integer> imo = new 
        // Model<Integer>(poz.getLength()); 
        // tf.add(new AttributeAppender("maxlength", imo, " ")); 
        // IModel<Integer> siz = new Model<Integer>(50); 
        // tf.add(new AttributeAppender("size", imo, " ")); 
        item.add(fragM); 
        System.out.println("Memo:" + poz.getLabel()); 
        return; 

       } 
       { 
        Fragment fragS = new Fragment("dynamicValue", "smallValue", ValuesPanel.this); 
        SingleFieldModel<String> model = new SingleFieldModel<String>(detachableRVModel, poz); 
        TextField<String> tf; 
        fragS.add(tf = new TextField<String>("value", model)); 
        IModel<Integer> imo = new Model<Integer>(poz.getLength()); 
        tf.add(new AttributeAppender("maxlength", imo, " ")); 
        IModel<Integer> siz = new Model<Integer>(50); 
        tf.add(new AttributeAppender("size", siz, " ")); 
        System.out.println("Single:" + poz.getLabel()); 
        item.add(fragS); 
       } 
      } 
2

Vous pouvez utiliser un modèle d'usine qui est externe à votre page principale. Le code dans l'usine ressemblerait à ce que vous avez déjà.

protected void populateItem(Item<BaseClass> item) { 
    item.add(PanelFactory.getPanel("content", item.getModelObject()); 
}