Wicket 8 DateTextField(来自Wicket扩展)

Wicket 8 DateTextField(来自Wicket扩展),date,wicket,textfield,models,Date,Wicket,Textfield,Models,我有一个简单的Java类,我们把它命名为Person:顾名思义,它包含关于一个人的信息。所以它有名字、姓氏、地址、性别、电话号码和我的罪魁祸首——生日。 我有一个允许用户编辑这些字段的页面:它由一个自动完成的文本字段组成,用户可以在其中输入个人ID或部分ID,并从下拉列表中选择要编辑的个人。页面的其余部分是一个文本字段列表,这些字段与Wicket模型绑定到用户从列表中选择的人:发生这种情况时,每个文本字段都会正确地填充所选的人对象的属性。 表示文本字段及其模型的java简短示例: private

我有一个简单的Java类,我们把它命名为Person:顾名思义,它包含关于一个人的信息。所以它有名字、姓氏、地址、性别、电话号码和我的罪魁祸首——生日。 我有一个允许用户编辑这些字段的页面:它由一个自动完成的文本字段组成,用户可以在其中输入个人ID或部分ID,并从下拉列表中选择要编辑的个人。页面的其余部分是一个文本字段列表,这些字段与Wicket模型绑定到用户从列表中选择的人:发生这种情况时,每个文本字段都会正确地填充所选的人对象的属性。 表示文本字段及其模型的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"));
[...]
私人;
[...]
formPatient=新表格(“patientForm”,新PropertyModel(“此人”);
[...]
formPatient.add(tmp=newmytextfield(“nome”),newpropertyModel(this,“person.nome”));
formPatient.add(tmp=newmytextfield(“secondoNome”、newpropertyModel(“person.secondoNome”));
formPatient.add(tmp=newmytextfield(“cognome”,newpropertymodel(“person.cognome”));
dropdownthoice sessodc=new-dropdownthoice(“sesso”),new-PropertyModel(这个“person.sesso”),Arrays.asList(Enums.Sex.values());
formPatient.add(sessodc);
formPatient.add(dtf=newdatetextfield(“bday”),newpropertyModel(“person.bday”),“dd/MM/yyyy”);
[...]
正如我所说,这很好用。但是,对于生日字段,我需要使用带有日历选择器的文本字段。只需将相关的HTML标记从

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


为了有一个好的和易于使用的选择器来选择日期

问题是,当HTML类型设置为“日期”时,自动更新功能停止工作: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">

因此,即使文本字段本身似乎无法显示日期信息,日期信息仍然存在


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

根据值,应使用
-
作为月、日和年之间的分隔符。

我今天实现了一个文本字段,它使用html5输入type=“date”并在Java 8中存储日期-到目前为止,它可以工作。以下是实施方案-可能对您有用:

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);
         }
      };
   }

}
公共类Html5LocalDateField扩展了TextField{
公共Html5LocalDateField(字符串id,IModel模型){
超级(id,型号);
添加(AttributeModifier.replace(“type”,“date”));
}
@凌驾
公共IConverter getConverter(类类型){
返回新的IConverter(){
私有静态最终长serialVersionUID=-986861910933163601L;
@凌驾
公共LocalDate转换对象(字符串值、区域设置){
返回LocalDate.parse(值,DateTimeFormatter.ISO_DATE);
}
@凌驾
公共字符串convertToString(LocalDate,Locale){
返回日期.格式(DateTimeFormatter.ISO_日期);
}
};
}
}

我尝试将模式“dd-MM-yyyy”传递给DateTextField构造函数:该字段仍然显示带斜杠的默认空值(“dd/MM/yyyy”),但呈现的HTML是空的。谢谢你的提示。也许我以前不太清楚。尽管已将分隔符更改为-,但自动更新功能仍然无法工作,即使新模式似乎使用正确,如呈现的HTML所示。正如martin-g引用的链接所示,尝试使用模式
yyyy-MM-dd
:“[…]而日期值的格式始终为yyyy-MM-dd。”我记不清了(一年前编码),波兰语设置中的Wicket date组件(带日历图标)在键盘/鼠标操作上有细微差别。键盘输入有更大的“接受格式范围”,鼠标点击缩小(或反转)。大体上同意你的观点@martin-g。Best is by documentation我很糟糕,没有注意到martin-g建议的链接颠倒了字段顺序。我刚刚实现了它,它似乎工作得很好。感谢@Tekki帮助我注意到。所以,我猜它们提供了一个日期选择器以及常用的文本字段?是的。链接中有示例来自martin-g:。我认为这就是您试图实现的目标将输入类型
文本
更改为
日期
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);
         }
      };
   }

}