2010-11-19 108 views
2

我发现下面的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); 
      } 
     }); 
    } 
} 

假设我有下面的类:

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

您正在查找的是PropertyModel class。 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什么是在模型中下拉列表中值。编辑:
是的,可以用按钮而不是自动设置值。为此,请勿使用PropertyModel。相反,创建一个新的检票Button对象,并使用代码覆盖它onSubmit()方法类似

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

或者,如果你想AJAXically做到这一点,把那一个AjaxFormChoiceComponentUpdatingBehavioronUpdate()方法内。

+0

我做了什么,恩喜欢阿卡尔=新车说(“”” “);最终DropDownChoice makes = new DropDownChoice (“makes”, new PropertyModel (aCar,“name”),makeChoices); final DropDownChoice models = new DropDownChoice (“models”, new PropertyModel (aCar,“model”),modelChoices);它不能正常工作 – 2010-11-19 20:01:40

+0

我通过编码aCar.setName(this.selectedMake)得到选定的汽车名称;但我不知道如何分配汽车模型 – 2010-11-19 20:15:39

+0

@ajdar,你不应该手工分配任何东西。我正在测试。 – Pops 2010-11-19 21:03:17

0

最好在表单上使用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(); 
相关问题