在检票口 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);
这实际上会提交所有三个值,而不是只提交一个。一切都应该有效。
我正在尝试获取 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);
这实际上会提交所有三个值,而不是只提交一个。一切都应该有效。