在检票口 DateTimeField 中获取用户输入

Get user input in wicket DateTimeField

我正在尝试获取 DateTimeField 的 user-selected 值,但失败了。我目前有以下代码,非常适合我的 DropDownChoice objects:

public class DateTimeFieldPanel extends Panel {

    private final Date date;
    private String value;

    public DateTimeFieldPanel(Date date) {
        super("component");
        this.date = date;

        final DateTimeField dateTimeField = new DateTimeField("dateTimeField", new PropertyModel<Date>(this, "date"));

        dateTimeField.add(new AjaxFormComponentUpdatingBehavior("onchange") {

            @Override
            protected void onUpdate(AjaxRequestTarget target) {
                value = dateTimeField.getModel().getObject().toString();
            }
        });

        add(dateTimeField);
    }

    public Date getDate() {
        return date;
    }
}

问题是模型由于某种原因没有 object,所以 getObject() returns 为空。 我究竟做错了什么?为什么这适用于 DropDownChoicePanel 但不适用于 DateTimeField?

非常感谢!

更新: 我现在一团糟:

dateTimeField = new DateTimeField("dateTimeField", new PropertyModel<Date>(this, "date")) {

        @Override
        protected DateTextField newDateTextField(String id, PropertyModel dateFieldModel) {
            final DateTextField dateField = super.newDateTextField(id, dateFieldModel);
            dateField.add(new AjaxFormComponentUpdatingBehavior("change") {

                @Override
                protected void onUpdate(AjaxRequestTarget target) {
                    processInput();
                }
            });
            return dateField;

        }

        @Override
        protected TextField<Integer> newHoursTextField(final String id, IModel<Integer> model, Class<Integer> type) {
            final TextField<Integer> hoursTextField = new TextField<Integer>(id, model, type);
            hoursTextField.add(new AjaxFormComponentUpdatingBehavior("change") {

                @Override
                protected void onUpdate(AjaxRequestTarget target) {
                    processInput();
                }
            });

            hoursTextField.add(getMaximumHours() == 24 ? RangeValidator.range(0, 23) : RangeValidator.range(1, 12));
            hoursTextField.setLabel(new Model<String>(HOURS));
            return hoursTextField;
        }

        private int getMaximumHours() {
            return getMaximumHours(use12HourFormat());
        }

        private int getMaximumHours(boolean use12HourFormat) {
            return use12HourFormat ? 12 : 24;
        }

        @Override
        protected boolean use12HourFormat() {
            String pattern = DateTimeFormat.patternForStyle("-S", getLocale());
            return pattern.indexOf('a') != -1 || pattern.indexOf('h') != -1 || pattern.indexOf('K') != -1;
        }
    };

基本上我发现 DateTimeField 由三个 TextField 组成,一个用于日期、小时和分钟。我必须通过重写创建这些字段的方法分别向这些字段添加 ajax 行为,然后调用 processInput() 以便更新 DateTimeField 的 ModelObject。这适用于日期部分。在这几个小时内,我可以重写创建字段的方法,但调用 processInput() 似乎不会为我的 DateTimeField 更新 ModelObject。最后,我最大的问题是没有为会议记录创建字段的方法。因此我一开始就不能覆盖它。 我怀疑我这样做太复杂了,但我哪里出错了?

如有任何帮助,我们将不胜感激。

我不确定为什么文档会指向 AjaxFormComponentUpdatingBehavior

这里的问题是它只会在每个字段的内容发生变化时更新它。因此,如果分钟字段发生变化,它只会 POST minuteField 输入。因此,每次您在执行 minute/hour 更新后尝试转换输入时,它都不会找到日期,因此会失败。

见DateTimeField.convertInput

            // Get the converted input values
        Date dateFieldInput = dateField.getConvertedInput();
        Integer hoursInput = hoursField.getConvertedInput();
        Integer minutesInput = minutesField.getConvertedInput();
        AM_PM amOrPmInput = amOrPmChoice.getConvertedInput();

        if (dateFieldInput == null)
        {
            return;
        }

我建议将 DateTimeField 包装在一个表单中,并在更改事件期间提交整个表单,例如:

    final Form<?> form = new Form("form");
    add(form);

    IModel<Date> dateModel = Model.of();
    DateTimeField dateTimeField = new DateTimeField("dateTimeField", dateModel) {

        @Override
        protected DateTextField newDateTextField(String id, PropertyModel dateFieldModel) {
            DateTextField dateField = super.newDateTextField(id, dateFieldModel);
            dateField.add(new AjaxFormSubmitBehavior(form, "change") {
            });
            return dateField;

        }

        @Override
        protected TextField<Integer> newMinutesTextField(String id, IModel<Integer> model, Class<Integer> type) {
            TextField<Integer> textField = super.newMinutesTextField(id, model, type);
            textField.add(new AjaxFormSubmitBehavior(form, "change") {
            });

            return textField;
        }

        @Override
        protected TextField<Integer> newHoursTextField(final String id, IModel<Integer> model, Class<Integer> type) {
            TextField<Integer> textField = super.newHoursTextField(id, model, type);
            textField.add(new AjaxFormSubmitBehavior(form, "change") {
            });
            return textField;
        }
    };
    form.add(dateTimeField);

这实际上会提交所有三个值,而不是只提交一个。一切都应该有效。