【问题标题】:How do you get values from a dropdown list in Wicket?您如何从 Wicket 的下拉列表中获取值?
【发布时间】:2010-11-19 18:39:46
【问题描述】:

我找到了以下 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 对象。我该怎么做?

【问题讨论】:

    标签: java ajax wicket


    【解决方案1】:

    您正在寻找PropertyModel class。 Wicket PropertyModels 可以让您将组件的值直接绑定到源中的值。 Javadoc 示例代码是

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

    当该标签被添加到页面时,它会在person.name 中显示值,而无需您进行额外的工作。

    您的汽车示例代码已使用PropertyModels,因此您只需更改目标即可。例如:

    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 的值设置为makes 下拉列表中的内容,并将theCar.model 的值设置为models 下拉列表中的内容。

    编辑:
    是的,可以使用按钮而不是自动设置值。为此,请勿使用PropertyModels。相反,创建一个新的 Wicket Button 对象并使用类似的代码覆盖其 onSubmit() 方法

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

    或者,如果您想以 AJAX 方式执行此操作,请将其放入 AjaxFormChoiceComponentUpdatingBehavioronUpdate() 方法中。

    【讨论】:

    • 我按照你说的做了 aCar = new Car("",""); final DropDownChoice make = new DropDownChoice("makes", new PropertyModel(aCar, "name"), makeChoices); final DropDownChoice models = new DropDownChoice("models", new PropertyModel(aCar,"model"), modelChoices);而且它不能正常工作
    • 我通过编码 aCar.setName(this.selectedMake);但我不知道如何分配汽车的型号
    • @ajdar,您不必手动分配任何内容。我现在正在测试。
    • ok.Dement 让我很困惑。我可以使用按钮将变量分配给我的对象吗?如何?
    • 当我添加 AjaxFormChoiceComponentUpdatingBehavior() 时,它给了我错误行为只能添加到 RadioChoice/CheckboxChoice/RadioGroup/CheckGroup 的实例。
    【解决方案2】:

    最好在表单上使用 CompoundPropertyModel,在其上添加 DropDownChoice 组件。

    如果您希望 DropDownChoice 具有划分区域,例如“Ford”、“Audi”等。您可以使用 Wicket Select 组件,您可以在此处阅读:http://wicket.apache.org/apidocs/1.4/org/apache/wicket/extensions/markup/html/form/select/Select.html

    通常您可以使用 dropDownName.getModelObject() 或 dropDownName.getDefaultModelObject() 方法从 DropDown 获取值。如果它不起作用,你应该尝试看看,什么

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

    显示,可能模型有问题。

    如果您使用 CompoundPropertyModel,则无需直接从 DropDownChoice 获取值,而是从 CompoundPropertyModel 获取值,使用类似:

    model.getObject.getMakes();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 2020-08-11
      • 2013-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多