Я пытаюсь получить выбранное пользователем значение 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. Наконец, моя самая большая проблема заключается в том, что нет метода, который создает поле для минут. Поэтому я не могу переопределить его в первую очередь. Я подозреваю, что делаю это слишком сложно, но где я иду не так?
Любая помощь будет высоко оценена.
Привет, Торстен, спасибо, что нашли время, чтобы ответить на мой вопрос. Однако у меня осталось 2 вопроса. Самое главное: как указано ранее, метод newMinutesTextField() не существует и, следовательно, не может быть переопределен. Во-вторых (но не так важно): это решение по-прежнему все равно передает все значения. Каждый раз после обновления одного из полей (дата, часы или минуты) запускается запрос формы. Поэтому, когда я начинаю вводить дату и перехожу, чтобы ввести часы, дата уже отправлена. Это, однако, то, что я могу закодировать, так что это не большая проблема. –
Извинения, я просто понял, что я забыл ту часть, где вы проверяете nullvalues. Однако самая большая проблема остается. Также я не уверен в том, что вы добавили все в форму, поскольку я мог бы проверить нулевые значения, даже если DateTimeField не был частью формы. –
Основная причина, по которой я добавил форму, так это просто отправить эти 3 значения (дата, часы, минуты). У вас может быть более крупная форма вокруг этого и не хочу, чтобы все было отправлено (или вы хотите). В любом случае вам понадобится одна форма вокруг FormComponent. Какую версию калитки вы используете? Я проверил код с последней калитки 7.x, и у меня был метод newMinutesTextField() –