2016-09-12 3 views
0

Я пытаюсь получить выбранное пользователем значение DateTimeField, но я не сработал. Я в настоящее время есть следующий код, который прекрасно работает для моих объектов DropDownChoice:Получить пользовательский ввод в wicket DateTimeField

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

Проблема заключается в том, что модель не есть объект, по некоторым причинам, так GetObject() возвращает нуль. Что я делаю неправильно? Почему это работает для DropDownChoicePanel, но не для DateTimeField?

Большое спасибо!

Update: теперь у меня есть этот беспорядок:

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 состоит из трех TextFields, один для даты, часа и минуты. Я должен добавить поведение ajax к этим полям отдельно, переопределив методы, которые их создают, а затем вызовите processInput(), чтобы обновить ModelObject для DateTimeField. Это работает для части даты. В течение часов я могу переопределить метод, который создает поле, но вызов processInput(), похоже, не обновляет ModelObject для моего DateTimeField. Наконец, моя самая большая проблема заключается в том, что нет метода, который создает поле для минут. Поэтому я не могу переопределить его в первую очередь. Я подозреваю, что делаю это слишком сложно, но где я иду не так?

Любая помощь будет высоко оценена.

ответ

0

Я не уверен, почему документация укажет вам на AjaxFormComponentUpdatingBehavior.

Проблема заключается в том, что он будет обновлять содержимое каждого поля, если это изменится. Поэтому, если поле минут изменяется, оно будет только POST на вкладке minuteField. Поэтому каждый раз, когда вы пытаетесь преобразовать ввод после выполнения минутного/часового обновления, он не найдет дату и, следовательно, не сработает.

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

Это на самом деле представить все три вместо одного. И все должно работать.

+0

Привет, Торстен, спасибо, что нашли время, чтобы ответить на мой вопрос. Однако у меня осталось 2 вопроса. Самое главное: как указано ранее, метод newMinutesTextField() не существует и, следовательно, не может быть переопределен. Во-вторых (но не так важно): это решение по-прежнему все равно передает все значения. Каждый раз после обновления одного из полей (дата, часы или минуты) запускается запрос формы. Поэтому, когда я начинаю вводить дату и перехожу, чтобы ввести часы, дата уже отправлена. Это, однако, то, что я могу закодировать, так что это не большая проблема. –

+0

Извинения, я просто понял, что я забыл ту часть, где вы проверяете nullvalues. Однако самая большая проблема остается. Также я не уверен в том, что вы добавили все в форму, поскольку я мог бы проверить нулевые значения, даже если DateTimeField не был частью формы. –

+0

Основная причина, по которой я добавил форму, так это просто отправить эти 3 значения (дата, часы, минуты). У вас может быть более крупная форма вокруг этого и не хочу, чтобы все было отправлено (или вы хотите). В любом случае вам понадобится одна форма вокруг FormComponent. Какую версию калитки вы используете? Я проверил код с последней калитки 7.x, и у меня был метод newMinutesTextField() –