2010-11-19 88 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では、コンポーネントの値をソースの値に直接関連付けることができます。 Javadocのサンプルコードは、そのラベルがページに追加された場合、それはあなたの最後に余分な作業をperson.nameに値を表示します

Person person = getSomePerson(); 
add(new Label("myLabel", new PropertyModel(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の値とモデルのドロップダウンリストに何にtheCar.modelの値を設定します。

編集:
はい、値を自動的にではなくボタンで設定することは可能です。これを行うには、PropertyModelを使用しないでください。あなたはAJAXicallyそれをしたい場合は代わりに、新しい改札Buttonオブジェクトを作成し、

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

のようなコードでそのonSubmit()メソッドをオーバーライドしたり、置くことAjaxFormChoiceComponentUpdatingBehavioronUpdate()メソッドの内部。

+0

を");最終DropDownChoice は、新しいDropDownChoiceを作成します。( "makes"、 新しいPropertyModel (aCar、 "name")、makeChoices); 最終DropDownChoice モデル=新しいDropDownChoice ( "models"、 new PropertyModel (aCar、 "model")、modelChoices);それは正しく動作しません –

+0

私はaCar.setName(this.selectedMake)をコーディングして、選択した車名を取得します。しかし、私は車のモデルを割り当てる方法を知らない –

+0

@ajdar、手で何かを割り当てる必要はありません。私は今テスト中です。 – Pops

0

FormでCompoundPropertyModelを使用すると、DropDownChoiceコンポーネントを追加する方がよいでしょう。

"Ford"、 "Audi"などのような分割領域を持つDropDownChoiceを使用したい場合は、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から、のようなものを使用:TUは「(ACAR =新しい車のように言った」、」私がやった

model.getObject.getMakes(); 
関連する問題