Wicket 8 DateTextField(来自wicket-extension)

时间:2018-05-09 15:14:24

标签: date wicket textfield models

我有一个简单的Java类,我们将其命名为Person:顾名思义,它包含有关某人的信息。所以它有姓名,姓氏,地址,性别,电话号码和我的罪魁祸首,生日等属性。 我有一个允许用户编辑这些字段的页面:它包含一个自动完成的文本字段,用户可以在其中输入人员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”文本,而不是实际日期。当用户从列表中选择Person时(甚至代表性别的下拉列表),所有其他字段仍然会更新,因此Wicket模型机制仍然有效。 我尝试重写方法,包括PropertyModel和DateTextField,以便查看在某些时候连接到DateTextField的模型对象是否丢失或者某些东西,但它始终存在,尽管它没有表示。我还发现最终的HTML是这样的:

<input style="display: table-cell;" type="text" wicket:id="bday" value="01/01/2011" name="bday">

所以日期信息就在那里,即使文本字段本身似乎无法显示它。

感谢任何帮助。如果您需要更多信息或更多代码,请告诉我。

2 个答案:

答案 0 :(得分:1)

根据https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/date,值应使用-作为月,日和年之间的分隔符。

答案 1 :(得分:1)

我今天实现了一个TextField,它使用html5输入type =“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);
         }
      };
   }

}