2013-01-24 9 views
7
  1. ich folgende Java-Klassen haben:Wicket - Wiederverwendbare Platten mit Java Vererbung

    enter image description here

  2. Ich habe eine zwei Form Komponenten, die zu Type1Task und Type2Task mit einem CompoundPropertyModel abgebildet werden:

enter image description here

Problem: Doppelter Code. Ich möchte, dass die D- und E-Felder einer Aufgabe zugeordnet werden, nicht die Aufgabentypen. Gibt es eine Möglichkeit, dies wiederverwendbar zu machen, wenn ich Java Vererbung habe?

Wenn ja, können Sie mir Tutorials oder Referenzen zur Verfügung stellen?

Zusätzliche Informationen: Die Task kann einen Timer (Thread) enthalten. Wenn Sie auf Senden klicken, wird der Timer gestartet.

Vielen Dank!

+0

Ich bin mir nicht ganz sicher, ob ich das Problem verstehe. Wenn Sie Ihre Aufgabenobjekte jedoch in das Modell einfügen, können sie keine Threads referenzieren, da Modellobjekte serialisierbar sein müssen. – biziclop

Antwort

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"))); 
     } 
} 

Ist das, was Sie wollten, oder habe ich nicht richtig verstanden?

6

Sie können dieselbe Klassenhierarchie im UI duplizieren.

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")); 
} 

} 

Und die HTML-Dateien:

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> 

Hinweis: Stellen Sie sicher, dass Sie ein ladbares deletachemodel verwenden, um die Aufgabenobjekte zu umbrechen, wenn sie einen Verweis auf einen Thread enthalten, andernfalls werden Serialisierungsprobleme auftreten. Eine Singleton-Registry, die Ihre Aufgaben speichert und sie durch einen zufälligen Schlüssel zurückgeben kann, ist genug.

+0

hmmm aber da ist ein kleines Problem ... Ich habe meine Form in einer Seite, und da ist schon ein . Ich hätte also ein in einem anderen ... –

+0

Das sind Panels, keine Seiten. Sie können das entsprechende Feld innerhalb des Formulars hinzufügen. Panels haben ihr eigenes Markup mit ihrer eigenen Markup-Vererbungshierarchie. – cserepj

+0

Danke. Ich werde es ausprobieren. Sobald ich arbeite, werde ich als beantwortet markieren. –