在DateTimeField组件中,它同时显示日期(年、月、日)和小时(小时、分钟、秒)。现在我不想约会了。有没有办法只允许显示和获取时间(小时:分钟:秒)?
发布于 2017-10-16 02:50:33
tl;dr
从Vaadin 8.1开始,没有内置的方式只显示一天中的时间。
你可以做你自己的。
详细信息
现有的DateTimeField]()小部件只支持遗留的GregorianCalendar类,它是日期和时间加上时区的组合。因此对于仅限时间的值没有用处。
不幸的是,从Vaadin8.1开始,捆绑的字段小部件似乎还没有针对您想要的java.time.LocalTime等java.time类型进行更新。
作为缺少智能LocalTime-savvy字段的解决方法,我建议:
add-on是一个可以添加到Vaadin项目中的扩展,用于提供一些与Vaadin相关的功能。附加组件可以是与可视小部件相关的,也可以是非可视后端功能。如果像这样可视化,您可能需要重新构建项目以重新创建小部件集。也许是Maven和releases).
clean而变化。使用常规文本字段。编写一个验证器,将用户输入parses作为LocalTime对象进行验证。您可以选择编写特定于Vaadin的验证器或标准的验证器。请参阅示例
下面是一些用于创建您自己的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 = 201710132100L;
@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 );
}
}
} );发布于 2020-06-04 15:38:17
在我的解决方案中,我使用了一个TextField,并在相关的绑定器中添加了一个自定义验证器:
.withValidator(this::validateTime, "Invalid time")我实现了验证方法,如下所示:
private boolean validateTime(final String timeString) {
try {
LocalTime.parse(timeString);
return true;
} catch (final DateTimeParseException e) {
return false;
}
}发布于 2020-06-14 19:15:23
现在Vaadin14.2.x提供了新的DateTimePicker组件来解决这个问题。
https://stackoverflow.com/questions/46752725
复制相似问题