2013-01-24 25 views
7
  1. Ho seguenti classi Java:Wicket - pannelli riutilizzabili con java ereditarietà

    enter image description here

  2. Ho un due componenti di forma che sono mappati a Type1Task e Type2Task con un CompoundPropertyModel:

enter image description here

Problema: codice duplicato. Voglio che i campi D ed E siano mappati su un'attività, non sui tipi di attività. C'è un modo per rendere questo riutilizzabile quando ho hava java ereditarietà?

In caso affermativo, è possibile fornirmi esercitazioni o riferimenti?

Ulteriori informazioni: L'attività può contenere un timer (thread). Se fai clic sul pulsante di invio, il timer verrà avviato.

Grazie!

+0

Non sono sicuro di aver capito il problema. Ma per inciso, se hai intenzione di mettere i tuoi oggetti compito nel modello, non possono fare riferimento a thread come gli oggetti modello devono essere serializzabili. – biziclop

risposta

0
public class TaskPanel extends FormComponentPanel{ 

     private IModel<Task> taskModel; 

     public TaskPanel(String id, IModel<Task> model){ 
     taskModel = model; 
     add(new TextField("DTextField", new PropertyModel(taskModel, "D"))); 
     add(new TextField("ETextField", new PropertyModel(taskModel, "E"))); 
     } 
} 

È questo che volevi o non ho capito bene?

6

È possibile duplicare la stessa gerarchia di classi nell'interfaccia utente.

public class TaskFormPanel<T extends Task> extends Panel { 

public TaskFormPanel(String id, IModel<T> model) 
    super(id, new CompoundPropertyModel(model)); 
    add(new TextField("d")); 
    add(new TextField("e)); 
    add(new Button("submit) { 
      (...) 
    } 
} 

} 


public class Task1FormPanel extends TaskFormPanel<Task1> { 

public TaskFormPanel(String id, IModel<Task1> model) 
    super(id, model); 
    add(new TextField("a")); 
    add(new TextField("b)); 
    add(new TextField("c")); 
} 

} 


public class Task2FormPanel extends TaskFormPanel<Task2> { 

public TaskFormPanel(String id, IModel<Task1> model) 
    super(id, model); 
    add(new TextField("x")); 
    add(new TextField("y)); 
    add(new TextField("z")); 
} 

} 

E il file HTML:

TaskFormPanel:

<wicket:panel> 
    <wicket:child/> 
    <label>d</label> <input wicket:id="d"> 
    <label>e</label> <input wicket:id="e"> 
    <input type="submit" wicket:id="submit"/> 
</wicket:panel> 

Task1Panel.html:

<wicket:extend> 
    <label>a</label> <input wicket:id="a"> 
    <label>b</label> <input wicket:id="b"> 
    <label>c</label> <input wicket:id="c"> 
</wicket:extend> 

Task2Panel.html:

<wicket:extend> 
    <label>x</label> <input wicket:id="x"> 
    <label>y</label> <input wicket:id="y"> 
    <label>z</label> <input wicket:id="z"> 
</wicket:extend> 

Nota: assicurarsi di utilizzare alcuni loadabledetachablemodel per racchiudere gli oggetti task se contengono un riferimento a un thread altrimenti si verificheranno problemi di serializzazione. Un registro singleton che memorizza le tue attività e può restituirle con una chiave casuale è sufficiente.

+0

hmmm ma c'è un piccolo problema ... ho il mio modulo dentro una pagina, e c'è già un . Quindi avrei un all'interno di un altro ... –

+0

Questi sono pannelli, non pagine. È possibile aggiungere il pannello appropriato all'interno del modulo. I pannelli hanno il proprio markup con la propria gerarchia di ereditarietà di markup. – cserepj

+0

Grazie. Lo proverò. Una volta che lavoro segnerò come risposta. –