2017-10-15 45 views
1

在DateTimeField组件中,它显示日期(年,月,日)和小时(小时,分钟,秒)。 现在我不想得到日期。任何想法只允许显示和获得时间(小时:分钟:秒)?在Vaadin中自定义DateTimeField 8

回答

1

TL;博士

没有内置的方式来显示时间的一天而已,至于Vaadin 8.1。

你可以自己做。

详细

现有DateTimeField]()插件仅支持遗留GregorianCalendar类,这是一日期一个时间 - 日期的时区的组合。因此对于仅限于时间的值而言没有用处。

不幸的是,从Vaadin 8.1起,似乎捆绑的字段小部件尚未更新为java.time类型,例如您想要的java.time.LocalTime

至于缺智能LocalTime -savvy场的解决办法,我建议要么:

  • 尝试date-time-fields Add-on
    附加组件是您可以添加到Vaadin项目中的扩展组件,以提供Vaadin相关功能的一些金块。附加组件可能与视觉控件相关,也可能是非视觉后端功能。如果是这样的可视化,则可能需要重建项目以重新创建组件集。也许Maven cleaninstall(不确定,因为这种技术会随着Vaadin的各种版本而不断变化)。
  • 制作你自己的。使用常规文本字段。写一个验证器来验证用户输入parses作为LocalTime对象。您可以选择编写一个Vaadin专用验证程序或标准验证程序Bean Validation。请参阅How to add Validators in Vaadin 8

下面是创建自己的LocalTime -savvy领域的一些粗糙的代码。这绝不是完整的,但可能会帮助您指出正确的方向。

final Label whenLabel = new Label("when?"); 
final TextField whenField = new TextField(); 
whenField.setCaption("When:"); 
whenField.setValueChangeMode(ValueChangeMode.BLUR); 
whenField.addValueChangeListener(new HasValue.ValueChangeListener <String>() 
{ 
    static final long serialVersionUID =0L; 

    @Override 
    public void valueChange (HasValue.ValueChangeEvent <String> valueChangeEvent) 
    { 
     String input = whenField.getValue(); 
     System.out.println("input: " + input); 
     try 
     { 
      // DateTimeFormatter f = DateTimeFormatter.ISO_LOCAL_TIME; // Constant ISO_LOCAL_TIME is for time-of-day in standard ISO 8601 format. 
      // DateTimeFormatter f = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT).withLocale(Locale.CANADA_FRENCH); // Automatically localize. 
      DateTimeFormatter f = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT).withLocale(Locale.US); // Automatically localize. 
      LocalTime localTime = LocalTime.parse(input , f); 
      String timeIso8601 = localTime.toString(); 
      whenLabel.setValue(timeIso8601); 
     } catch (DateTimeParseException e) 
     { 
      whenLabel.setValue(e.getClass().getCanonicalName()); 
      System.out.println("ERROR - failed to parse input: " + input); 
     } 
    } 
});