Как вы получаете значения из выпадающего списка в Wicket? - PullRequest
2 голосов
/ 19 ноября 2010

Я нашел следующий пример кода Wicket:

package org.apache.wicket.examples.ajax.builtin;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;

/**
 * Linked select boxes example
 * 
 * @author Igor Vaynberg (ivaynberg)
 */
public class ChoicePage extends BasePage
{
    private String selectedMake;

    private final Map<String, List<String>> modelsMap = new HashMap<String, List<String>>(); // map:company->model

    /**
     * @return Currently selected make
     */
    public String getSelectedMake()
    {
        return selectedMake;
    }

    /**
     * @param selectedMake
     *            The make that is currently selected
     */
    public void setSelectedMake(String selectedMake)
    {
        this.selectedMake = selectedMake;
    }

    /**
     * Constructor.
     */
    public ChoicePage()
    {
        modelsMap.put("AUDI", Arrays.asList(new String[] { "A4", "A6", "TT" }));
        modelsMap.put("CADILLAC", Arrays.asList(new String[] { "CTS", "DTS", "ESCALADE", "SRX",
                "DEVILLE" }));
        modelsMap.put("FORD", Arrays.asList(new String[] { "CROWN", "ESCAPE", "EXPEDITION",
                "EXPLORER", "F-150" }));

        IModel<List<? extends String>> makeChoices = new AbstractReadOnlyModel<List<? extends String>>()
        {
            @Override
            public List<String> getObject()
            {
                Set<String> keys = modelsMap.keySet();
                List<String> list = new ArrayList<String>(keys);
                return list;
            }

        };

        IModel<List<? extends String>> modelChoices = new AbstractReadOnlyModel<List<? extends String>>()
        {
            @Override
            public List<String> getObject()
            {
                List<String> models = modelsMap.get(selectedMake);
                if (models == null)
                {
                    models = Collections.emptyList();
                }
                return models;
            }

        };

        Form<?> form = new Form("form");
        add(form);

        final DropDownChoice<String> makes = new DropDownChoice<String>("makes",
            new PropertyModel<String>(this, "selectedMake"), makeChoices);

        final DropDownChoice<String> models = new DropDownChoice<String>("models",
            new Model<String>(), modelChoices);
        models.setOutputMarkupId(true);

        form.add(makes);
        form.add(models);

        makes.add(new AjaxFormComponentUpdatingBehavior("onchange")
        {
            @Override
            protected void onUpdate(AjaxRequestTarget target)
            {
                target.addComponent(models);
            }
        });
    }
}

Предположим, у меня есть следующий класс:

public class car{
      private String name;
      private String  model;

      public setname(String n){
           this.name=n;
      }
      public setModel(String m){
           this.model=m;
      }
      ///  and getters...
}

Я хочу создать объект car в примере кода и назначить значения, выбранные в раскрывающемся списке, для объекта car. Как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 19 ноября 2010

Вы ищете PropertyModel класс . Wicket PropertyModel s может позволить вам связать значение компонента непосредственно со значением в вашем источнике. Пример кода Javadoc:

Person person = getSomePerson();
add(new Label("myLabel", new PropertyModel(person, "name"));

Когда этот ярлык добавляется на страницу, он отображает значение в person.name без дополнительной работы с вашей стороны.

Ваш пример кода автомобиля уже использует PropertyModel s, поэтому все, что вам нужно сделать, это изменить цель. Например:

car theCar = new car();
final DropDownChoice<String> makes = new DropDownChoice<String>("makes",
        new PropertyModel<String>(theCar, "name"), makeChoices);
final DropDownChoice<String> models = new DropDownChoice<String>("models",
        new PropertyModel<String>(theCar, "model"), modelChoices);

Это установит значение theCar.name в раскрывающемся списке марок, а значение theCar.model - в раскрывающемся списке моделей.

EDIT:
Да, можно установить значения с помощью кнопки, а не автоматически. Для этого не используйте PropertyModel s. Вместо этого создайте новый объект Wicket Button и переопределите его метод onSubmit() с помощью кода, подобного

theCar.setName(makes.getValue());
theCar.setModel(models.getValue());

Или, если вы хотите сделать это AJAXically, поместите это в метод AjaxFormChoiceComponentUpdatingBehavior onUpdate().

0 голосов
/ 30 апреля 2012

Лучше использовать CompoundPropertyModel в форме, в которую вы добавляете компоненты DropDownChoice.

Если вы хотите иметь DropDownChoice с разделенными областями, например, «Ford», «Audi» и т. Д., Вы можете использовать компонент Wicket Select, вы можете прочитать об этом здесь:

И обычно вы можете получить значение из DropDown, используя методы dropDownName.getModelObject () или dropDownName.getDefaultModelObject (). Если это не работает, вы должны попытаться увидеть, что

System.out.println("something: "+dropDownName.getModelObject());    

показывает, возможно, есть проблемы с моделью.

Если вы используете CompoundPropertyModel, вам не нужно получать значение напрямую из DropDownChoice, но из CompoundPropertyModel используйте что-то вроде:

model.getObject.getMakes();
...