Выпадающий список устанавливает определенный выбранный индекс

#java #drop-down-menu #wicket

#java #выпадающее меню #калитка

Вопрос:

У меня есть выпадающий список :

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

Мой вопрос:

  1. Как установить для выбранного индекса значение 2 или любое другое?
  2. Как удалить первый пустой параметр по умолчанию?

Спасибо.

Ответ №1:

Вы должны иметь возможность устанавливать выбранный индекс с помощью PropertyModel вместо жесткого кодирования значений выпадающего списка. На данный момент я не могу протестировать, но это было бы что-то вроде

 String timePeriodValue = "Bi-Weekly";

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

В качестве бонуса, сам процесс установки значения по умолчанию должен устранить проблему с пустой опцией.

Комментарии:

1. Добро пожаловать, @Tapas. Я помню, как был по-настоящему удивлен, почти шокирован, когда впервые понял, что PropertyModel отношения работают для настройки объектов на основе свойств, а не только для настройки самих свойств.

2. каким будет параметр «this» в конструкторе PropertyModel?

3. @Определяет объект, содержащий timePeriodValue переменную.

4. На самом деле вам не нужно PropertyModel , просто используйте Model.of() construct 😉

Ответ №2:

DropDownChoice имеет конструктор, который принимает значение по умолчанию. Или в вашем коде вы можете добавить TimePeriod.setModel(Model.of(новый TimePeriod(2, «Раз в две недели»)))

Я предполагаю, что TimePeriod имеет надлежащие реализации #equals () и #hashCode ().

О пустой опции: см. org.apache.калитка.разметка.html.форма.AbstractSingleSelectChoice.isNullValid()

Ответ №3:

Лорд Торгамус и Мартин-джи благодарят вас обоих. Я провел небольшой тест. И это работает отлично. Как указал лорд Торгамус,

 @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 resu<
        }

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

    }
}
  

Приведенный выше код предоставлен для других пользователей, поскольку это может быть полезно, и я написал его с целью тестирования, поэтому все классы написаны в одном.java-файл, хотя это и не рекомендуется.

Спасибо.