开发者

DropDownChoice set a particular index selected

开发者 https://www.devze.com 2023-03-01 21:17 出处:网络
I have a DropDownChoice : DropDownChoice timePeriod = new DropDownChoice(\"timePeriod\", Arrays.asList(new TimePeriod(1, \"Weekly\"), new TimePeriod(2, \"Bi-Weekly\"), new TimePeriod(3, \"Semi-Monthl

I have a DropDownChoice :

       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);

My question is:

  1. How to set the selected index to 2 or any other?
  2. How to rem开发者_StackOverflow社区ove first default blank option?

Thank you.


You should be able to set the selected index by using a PropertyModel instead of hard-coding the values of the dropdown. I can't test at the moment, but it would be something like

String timePeriodValue = "Bi-Weekly";

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

As a bonus, the very act of setting a default value should eliminate the blank option problem.


DropDownChoice has a constructor which accepts the default value. Or in your code you can add timePeriod.setModel(Model.of(new TimePeriod(2, "Bi-Weekly")))

I guess TimePeriod has proper #equals() and #hashCode() implementations.

About the blank option: see org.apache.wicket.markup.html.form.AbstractSingleSelectChoice.isNullValid()


Lord Torgamus and martin-g thank you both of you. I did a small test. And it is working perfectly. As Lord Torgamus indicated,

@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 + "]";
        }

    }
}

The above code is provided for other users as it might be helpful and I wrote it for testing purpose so all the classes are written in one .java file although it is not advisable.

Thank you.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号