7
  1. 私は次のJavaクラスを持っています:

    ここに画像の説明を入力

  2. 私は、CompoundPropertyModel を使用して Type1Task と Type2Task にマップされた 2 つのフォーム コンポーネントを持っています。

ここに画像の説明を入力

問題: 重複コード。タスクの種類ではなく、D フィールドと E フィールドをタスクにマップする必要があります。Java継承があるときにこれを再利用可能にする方法はありますか?

はいの場合、チュートリアルやリファレンスを提供してもらえますか?

追加情報: タスクにはタイマー (スレッド) を含めることができます。送信ボタンをクリックすると、タイマーが開始されます。

ありがとうございました!

4

2 に答える 2

6

UI で同じクラス階層を複製できます。

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

}

そして HTML ファイル:

タスクフォームパネル:

<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>

注: タスク オブジェクトにスレッドへの参照が含まれている場合は、いくつかの loadabledetachablemodel を使用してタスク オブジェクトをラップしてください。そうしないと、シリアライゼーションの問題が発生します。タスクを保存し、ランダムなキーでそれらを返すことができるシングルトン レジストリで十分です。

于 2013-01-24T23:58:04.660 に答える
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")));
      }
}

これはあなたが望んでいたことですか、それとも私は正しく理解していませんでしたか?

于 2013-01-24T22:21:48.937 に答える