2012-02-21 9 views
0

ボタンをクリックして送信ボタンをクリックすると(このコードはレンダリングされますが、フォーム処理は動作しません)、奇妙なスタックトレースが発生します。例クラス:ListMultipleChoice(wicket 1.5.4)のモデル

public class SamplePage extends WebPage { 

    private List<String> list = Arrays.asList(new String[] { "item1", "item2", "item3" }); 
    private List<String> selectedItem = Arrays.asList(new String[] { "item1" }); 

    public SamplePage(final PageParameters parameters) { 
     super(parameters); 

     Form<?> form = new Form<Void>("form"); 
     form.add(new Button("submin") { 
      @Override 
      public void onSubmit() { 
       System.out.println("Selected"); 
       for (String tag : selectedItem) 
        System.out.println(tag); 
      } 
     }); 
     ListMultipleChoice<String> selector = new ListMultipleChoice<>("itemSelector", 
      new PropertyModel<List<String>>(this, "selectedItem"), list); 
     add(form); 
     form.add(selector); 
    } 
    public List<String> getSelectedItem() { 
     return selectedItem; 
    } 
    public void setSelectedItem(List<String> selectedItem) { 
     this.selectedItem = selectedItem; 
    } 
} 

Caused by: java.lang.UnsupportedOperationException 
    at java.util.AbstractList.remove(AbstractList.java:161) 
    at java.util.AbstractList$Itr.remove(AbstractList.java:374) 
    at java.util.AbstractList.removeRange(AbstractList.java:571) 
    at java.util.AbstractList.clear(AbstractList.java:234) 
    at org.apache.wicket.markup.html.form.FormComponent.updateCollectionModel(FormComponent.java:1531) 
    at org.apache.wicket.markup.html.form.ListMultipleChoice.updateModel(ListMultipleChoice.java:369) 
    at org.apache.wicket.markup.html.form.Form$FormModelUpdateVisitor.component(Form.java:221) 
    at org.apache.wicket.markup.html.form.Form$FormModelUpdateVisitor.component(Form.java:192) 
    at org.apache.wicket.util.visit.Visits.visitPostOrderHelper(Visits.java:273) 
    at org.apache.wicket.util.visit.Visits.visitPostOrderHelper(Visits.java:261) 
    at org.apache.wicket.util.visit.Visits.visitPostOrder(Visits.java:244) 
    at org.apache.wicket.markup.html.form.FormComponent.visitComponentsPostOrder(FormComponent.java:388) 
    at org.apache.wicket.markup.html.form.Form.internalUpdateFormComponentModels(Form.java:1701) 
    at org.apache.wicket.markup.html.form.Form.updateFormComponentModels(Form.java:1666) 
    at org.apache.wicket.markup.html.form.Form.process(Form.java:827) 
    at org.apache.wicket.markup.html.form.Form.onFormSubmitted(Form.java:762) 
    at org.apache.wicket.markup.html.form.Form.onFormSubmitted(Form.java:692) 
... 31 more 

私は問題を理解してどのように定義モデルであるが、(私は多くの方法を試してみましたが、問題を確認していなかった)理由を私は理解していません。私は同じようにDropDownChoiceを作成したとき、すべてが正常に働いていたが、この場合には、私は

new PropertyModel<List<String>>(this, "selectedItem") 

とは対照的に

new PropertyModel<String>(this, "field") 

を使用し、私はそれが非常に愚かな間違いだと思うし、あなたの助けをお願いします。

答えて

4

Arrays.asList()は固定サイズのリストを返します。あなた(つまりWicket)はそれを構成する要素を削除できません。実際にそれをしようとせず

private List<String> selectedItem = new ArrayList<String>(); 

public SamplePage(final PageParameters parameters) { 
    .... 
    selectedItem.add("item1"); 
+0

1分前このミスを発見しました。それは本当にばかげていた!ありがとうございました。 – pushistic

2

を、私はあなたがは、Arrays.asList(から入手List実装)は、リスト内のエントリの削除をサポートしていないことを推測:

は、代わりに別のリストを使用してください。

は、線に沿って何かを試してみてください:

例えば
private List<String> selectedItem = 
        new LinkedList(Arrays.asList(new String[] { "item1")}); 

削除を可能にする実装を使用します。 Wicketは、選択したアイテムを再読み込みするために、リスト内のエントリを変更する必要があります。

希望に役立ちます。 Bert