java - 您如何从 Wicket 的下拉列表中获取值?

标签 java ajax wicket

我找到了以下 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);
            }
        });
    }
}

假设我有以下类(class):

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 对象。我该怎么做?

最佳答案

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

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

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

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

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 下拉列表中的值。

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

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

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

关于java - 您如何从 Wicket 的下拉列表中获取值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4228260/

相关文章:

java - 将 AjaxEventBehavior 添加到表单的按钮可防止表单使用 Wicket 6.1 和 6.2 提交

javascript - 如何查询 Node.Js 的后端并更新页面而不重新加载 URL?

java - 通过 ajax/collapsible ListView 刷新 wicket 容器

java - Wicket 破解了 ListView 的使用,有哪些替代方案?

java - 虚拟专用服务器问题

在 Eclipse 中运行 Spark Word Count 时出现 Java 错误

java - 一种避免许多 servlet 的方法

java - 门线模型

Java - 就地旋转图像

java - REST API Jersey Glassfish 不序列化 json