2011-05-02 3 views
2

J'ai un DropDownChoice:DropDownChoice définir un index particulier choisi

 DropDownChoice timePeriod = new DropDownChoice("timePeriod", Arrays.asList(new TimePeriod(1, "Weekly"), new TimePeriod(2, "Bi-Weekly"), new TimePeriod(3, "Semi-Monthly"), new TimePeriod(4, "Monthly"), new TimePeriod(5, "Yearly")), new IChoiceRenderer() { 

      private static final long serialVersionUID = 10102L; 

      @Override 
      public String getIdValue(Object object, int index) { 
       return ((TimePeriod) object).getId() + ""; 
      } 

      @Override 
      public Object getDisplayValue(Object object) { 
       return ((TimePeriod) object).getPeriodType(); 
      } 
     }); 
     timePeriod.setNullValid(false); 

Ma question est:

  1. Comment définir l'index sélectionné pour 2 ou tout autre?
  2. Comment supprimer la première option vide par défaut?

Merci.

Répondre

5

Vous devriez être en mesure de définir l'index sélectionné à l'aide d'un PropertyModel au lieu de coder en dur la valeurs de la liste déroulante. Je ne peux pas tester pour le moment, mais ce serait quelque chose comme

String timePeriodValue = "Bi-Weekly"; 

DropDownChoice timePeriod = new DropDownChoice("timePeriod", 
    new PropertyModel(this, "timePeriodValue"), 
    Arrays.asList(/* your options */), 
    new IChoiceRenderer() { 
    // ... 
// Again, this is pseudocode only 

En prime, l'acte même de définir une valeur par défaut devrait éliminer le problème de l'option vide.

+0

je vous remercie pour votre suggestion. –

+1

De rien, @Tapas. Je me souviens d'avoir été vraiment surpris, presque choqué, la première fois que je me suis rendu compte que les relations 'PropertyModel' fonctionnaient pour définir les choses en fonction des propriétés, pas seulement pour définir les propriétés elles-mêmes. – Pops

+0

quel serait le paramètre "this" dans le constructeur PropertyModel? – Neets

1

DropDownChoice a un constructeur qui accepte la valeur par défaut. Ou dans votre code, vous pouvez ajouter des implémentations timePeriod.setModel (Model.of (nouveau timeperiod (2, "Bi-hebdomadaire")))

Je suppose que timeperiod a #equals propres() et #hashCode().

A propos de l'option vide: voir org.apache.wicket.markup.html.form.AbstractSingleSelectChoice.isNullValid()

+0

merci pour votre suggestion. –

0

Seigneur Torgamus et martin-g merci à vous deux. J'ai fait un petit test. Et ça fonctionne parfaitement. Comme Lord Torgamus indiqué,

@SuppressWarnings({ "unchecked", "rawtypes", "serial" }) 
public class MyPage extends WebPage { 

    public MyPage() {  
     add(new MyForm("form")); 
    } 

    private class MyForm extends Form { 

     public MyForm(String id) { 
      super(id); 
      setOutputMarkupPlaceholderTag(true); 
      setModel(new Model(new FormModel())); 
      final DropDownChoice timePeriod = new DropDownChoice("timePeriod", new PropertyModel(getModel(), "timePeriod"), Arrays.asList(new TimePeriod(1, "Weekly"), new TimePeriod(2, "Bi-Weekly"), new TimePeriod(3, "Semi-Monthly"), new TimePeriod(4, "Monthly"), new TimePeriod(5, "Yearly")), new IChoiceRenderer() { 

       private static final long serialVersionUID = 10102L; 

       @Override 
       public String getIdValue(Object object, int index) { 
        return ((TimePeriod) object).getId() + ""; 
       } 

       @Override 
       public Object getDisplayValue(Object object) { 
        return ((TimePeriod) object).getPeriodType(); 
       } 
      }); 
      timePeriod.setNullValid(false); 
      add(timePeriod); 
      timePeriod.setOutputMarkupPlaceholderTag(true); 
      timePeriod.add(new AjaxFormComponentUpdatingBehavior("onChange") { 

       @Override 
       protected void onUpdate(AjaxRequestTarget target) { 
        MyForm form = (MyForm) timePeriod.getParent(); 
        FormModel formModel = (FormModel) form.getModelObject(); 
        formModel.setTimePeriod(new TimePeriod(4, "Monthly")); 
        form.setModel(new Model(formModel)); 
        target.addComponent(form); 
       } 
      }); 
     } 

     @Override 
     public void onSubmit() { 
      System.out.println(getModelObject()); 
     } 

    } 
    private class FormModel implements Serializable { 
     private TimePeriod timePeriod = new TimePeriod(2, "Bi-Weekly"); 

     public FormModel() { 

     } 

     public TimePeriod getTimePeriod() { 
      return timePeriod; 
     } 

     public void setTimePeriod(TimePeriod timePeriod) { 
      this.timePeriod = timePeriod; 
     } 

     @Override 
     public String toString() { 
      return "FormModel [timePeriod=" + timePeriod + "]"; 
     } 

    } 

    private class TimePeriod implements Serializable { 
     private int id; 
     private String periodType; 

     public TimePeriod(int id, String periodType) { 
      super(); 
      this.id = id; 
      this.periodType = periodType; 
     } 

     public int getId() { 
      return id; 
     } 

     public void setId(int id) { 
      this.id = id; 
     } 

     public String getPeriodType() { 
      return periodType; 
     } 

     public void setPeriodType(String periodType) { 
      this.periodType = periodType; 
     } 

     @Override 
     public int hashCode() { 
      final int prime = 31; 
      int result = 1; 
      result = prime * result + getOuterType().hashCode(); 
      result = prime * result + id; 
      result = prime * result + ((periodType == null) ? 0 : periodType.hashCode()); 
      return result; 
     } 

     @Override 
     public boolean equals(Object obj) { 
      if (this == obj) 
       return true; 
      if (obj == null) 
       return false; 
      if (getClass() != obj.getClass()) 
       return false; 
      TimePeriod other = (TimePeriod) obj; 
      if (!getOuterType().equals(other.getOuterType())) 
       return false; 
      if (id != other.id) 
       return false; 
      if (periodType == null) { 
       if (other.periodType != null) 
        return false; 
      } else if (!periodType.equals(other.periodType)) 
       return false; 
      return true; 
     } 

     private LoginPage getOuterType() { 
      return LoginPage.this; 
     } 

     @Override 
     public String toString() { 
      return "TimePeriod [id=" + id + ", periodType=" + periodType + "]"; 
     } 

    } 
} 

Le code ci-dessus est fourni pour les utilisateurs, car il pourrait être utile et je l'ai écrit à des fins de test si toutes les classes sont écrits dans un fichier .java bien qu'il n'est pas conseillé.

Merci.

Questions connexes