Wicket 8 DateTextField(来自 wicket-extension)
Wicket 8 DateTextField (from wicket-extension)
我有一个简单的Java class,我们将其命名为Person:顾名思义,它包含有关一个人的信息。所以它具有名称、姓氏、地址、性别、phone 号码和我的罪魁祸首生日等属性。
我有一个允许用户编辑这些字段的页面:它包含一个自动完成的文本字段,用户可以在其中输入人员 ID 或其中的一部分,然后从下拉列表中选择他们想要编辑的人员。页面的其余部分是与 Wicket 模型绑定到用户从列表中选择的 Person 的文本字段列表:发生这种情况时,每个文本字段都会正确填充所选 Person 对象的属性。
java 表示文本字段及其模型的简短示例:
private Person person;
[...]
formPatient = new Form("patientForm", new PropertyModel<>(this, "person"));
[...]
formPatient.add(tmp = new MyTextField<>("nome", new PropertyModel<>(this, "person.nome")));
formPatient.add(tmp = new MyTextField<>("secondoNome", new PropertyModel<>(this, "person.secondoNome")));
formPatient.add(tmp = new MyTextField<>("cognome", new PropertyModel<>(this, "person.cognome")));
DropDownChoice sessoDDC = new DropDownChoice("sesso", new PropertyModel<>(this, "person.sesso"), Arrays.asList(Enums.Sex.values()));
formPatient.add(sessoDDC);
formPatient.add(dtf = new DateTextField("bday", new PropertyModel<Date>(this, "person.bday"), "dd/MM/yyyy"));
[...]
正如我所说,这很好用。但是,对于生日字段,我需要使用带有日历选择器的文本字段。它可以很容易地安排,只需将相关的 HTML 标记从
更改为
<input style="display: table-cell;" type="text" wicket:id="bday"/>
到
<input style="display: table-cell;" type="date" wicket:id="bday"/>
为了有一个漂亮且易于使用的选择器来选择日期。
问题是,当 HTML 类型设置为 "date" 时,自动更新功能停止工作:DateTextField 始终显示默认的 "dd/MM/yyyy" 文本,并且不是真正的约会。当用户从列表(甚至代表性别的下拉列表)中选择一个人时,所有其他字段仍然会更新,因此 Wicket 模型机制仍然有效。
我尝试覆盖 PropertyModel 和 DateTextField 的方法,以查看连接到 DateTextField 的模型对象是否在某个时候丢失或发生了什么,但它始终存在,尽管它没有被表示。我还发现最后的HTML是这样的:
<input style="display: table-cell;" type="text" wicket:id="bday" value="01/01/2011" name="bday">
所以日期信息就在那里,即使文本字段本身似乎无法显示它。
感谢任何帮助。如果您需要更多信息或更多代码,请告诉我。
根据 https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/date 值应使用 -
作为月、日和年之间的分隔符。
我今天实现了一个 TextField,它使用 html5 输入类型="date" 并将日期存储在 Java 8 LocalDate 中 - 到目前为止它可以工作。这是实现 - 也许对您有用:
public class Html5LocalDateField extends TextField<LocalDate> {
public Html5LocalDateField(String id, IModel<LocalDate> model) {
super(id, model);
add(AttributeModifier.replace("type", "date"));
}
@Override
public IConverter getConverter(Class type) {
return new IConverter<LocalDate>() {
private static final long serialVersionUID = -986861910933163601L;
@Override
public LocalDate convertToObject(String value, Locale locale) {
return LocalDate.parse(value, DateTimeFormatter.ISO_DATE);
}
@Override
public String convertToString(LocalDate date, Locale locale) {
return date.format(DateTimeFormatter.ISO_DATE);
}
};
}
}
我有一个简单的Java class,我们将其命名为Person:顾名思义,它包含有关一个人的信息。所以它具有名称、姓氏、地址、性别、phone 号码和我的罪魁祸首生日等属性。 我有一个允许用户编辑这些字段的页面:它包含一个自动完成的文本字段,用户可以在其中输入人员 ID 或其中的一部分,然后从下拉列表中选择他们想要编辑的人员。页面的其余部分是与 Wicket 模型绑定到用户从列表中选择的 Person 的文本字段列表:发生这种情况时,每个文本字段都会正确填充所选 Person 对象的属性。 java 表示文本字段及其模型的简短示例:
private Person person;
[...]
formPatient = new Form("patientForm", new PropertyModel<>(this, "person"));
[...]
formPatient.add(tmp = new MyTextField<>("nome", new PropertyModel<>(this, "person.nome")));
formPatient.add(tmp = new MyTextField<>("secondoNome", new PropertyModel<>(this, "person.secondoNome")));
formPatient.add(tmp = new MyTextField<>("cognome", new PropertyModel<>(this, "person.cognome")));
DropDownChoice sessoDDC = new DropDownChoice("sesso", new PropertyModel<>(this, "person.sesso"), Arrays.asList(Enums.Sex.values()));
formPatient.add(sessoDDC);
formPatient.add(dtf = new DateTextField("bday", new PropertyModel<Date>(this, "person.bday"), "dd/MM/yyyy"));
[...]
正如我所说,这很好用。但是,对于生日字段,我需要使用带有日历选择器的文本字段。它可以很容易地安排,只需将相关的 HTML 标记从
更改为<input style="display: table-cell;" type="text" wicket:id="bday"/>
到
<input style="display: table-cell;" type="date" wicket:id="bday"/>
为了有一个漂亮且易于使用的选择器来选择日期。
问题是,当 HTML 类型设置为 "date" 时,自动更新功能停止工作:DateTextField 始终显示默认的 "dd/MM/yyyy" 文本,并且不是真正的约会。当用户从列表(甚至代表性别的下拉列表)中选择一个人时,所有其他字段仍然会更新,因此 Wicket 模型机制仍然有效。 我尝试覆盖 PropertyModel 和 DateTextField 的方法,以查看连接到 DateTextField 的模型对象是否在某个时候丢失或发生了什么,但它始终存在,尽管它没有被表示。我还发现最后的HTML是这样的:
<input style="display: table-cell;" type="text" wicket:id="bday" value="01/01/2011" name="bday">
所以日期信息就在那里,即使文本字段本身似乎无法显示它。
感谢任何帮助。如果您需要更多信息或更多代码,请告诉我。
根据 https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/date 值应使用 -
作为月、日和年之间的分隔符。
我今天实现了一个 TextField,它使用 html5 输入类型="date" 并将日期存储在 Java 8 LocalDate 中 - 到目前为止它可以工作。这是实现 - 也许对您有用:
public class Html5LocalDateField extends TextField<LocalDate> {
public Html5LocalDateField(String id, IModel<LocalDate> model) {
super(id, model);
add(AttributeModifier.replace("type", "date"));
}
@Override
public IConverter getConverter(Class type) {
return new IConverter<LocalDate>() {
private static final long serialVersionUID = -986861910933163601L;
@Override
public LocalDate convertToObject(String value, Locale locale) {
return LocalDate.parse(value, DateTimeFormatter.ISO_DATE);
}
@Override
public String convertToString(LocalDate date, Locale locale) {
return date.format(DateTimeFormatter.ISO_DATE);
}
};
}
}