модель в ListMultipleChoice (калитка 1.5.4) - PullRequest
0 голосов
/ 21 февраля 2012

При нажатии кнопки отправки у меня появляется странная трассировка стека (этот код отображается, но не работает с обработкой форм).Пример класса:

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<String>(this, "field")

в отличие от

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

Я думаю, что это очень глупая ошибка и прошу вашей помощи.

Ответы [ 2 ]

4 голосов
/ 21 февраля 2012

Arrays.asList () возвращает список фиксированного размера, вы (т.е. калитка) не можете удалить элементы из него.

Вместо этого используйте другой список:

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

public SamplePage(final PageParameters parameters) {
    ....
    selectedItem.add("item1");
2 голосов
/ 21 февраля 2012

На самом деле, не пытаясь это сделать, но я предполагаю, что реализация List, которую вы получаете из Arrays.asList (), не поддерживает удаление записей в списке.

Попробуйте что-то вроде:

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

Например, используйте реализацию, которая позволяет удалять.Wicket необходимо изменить записи в списке, чтобы переопределить выбранные элементы.

Надеюсь, это поможет.Bert

...