gpt4 book ai didi

java - 在 wicket DateTimeField 中获取用户输入

转载 作者:行者123 更新时间:2023-11-30 07:09:28 26 4
gpt4 key购买 nike

我试图获取用户选择的 DateTimeField 值,但失败了。我目前有以下代码,它非常适合我的 DropDownChoice 对象:

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() 返回 null。我究竟做错了什么?为什么这适用于 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 分钟字段输入。因此,每次您尝试在进行分钟/小时更新后转换输入时,它都不会找到日期,因此会失败。

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

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

关于java - 在 wicket DateTimeField 中获取用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39452530/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com