如何使用 com.google.gwt.user.datepicker.client.DateBox 限制可用的日期范围

Posted

技术标签:

【中文标题】如何使用 com.google.gwt.user.datepicker.client.DateBox 限制可用的日期范围【英文标题】:How to limit the available Date ranges with the com.google.gwt.user.datepicker.client.DateBox 【发布时间】:2011-08-05 02:48:52 【问题描述】:

我需要限制Dates 用户可以从com.google.gwt.user.datepicker.client.DateBox 中选择的内容。

我似乎无法弄清楚如何限制最小 Date,因此他们无法选择过去的日期。

如果我不能使用 com.google.gwt.user.datepicker.client.DateBox 做到这一点,是否有替代的 DateBox 小部件可以让我获得这种灵活性?

【问题讨论】:

【参考方案1】:

根据我收到的建议,我提出了将可选日期限制在当天及之后的建议。这适用于 GWT 2.1.1

final DateBox dateBox = new DateBox();
dateBox.addValueChangeHandler(new ValueChangeHandler<Date>()

    @Override
    public void onValueChange(final ValueChangeEvent<Date> dateValueChangeEvent)
    
        if (dateValueChangeEvent.getValue().before(today()))
        
            dateBox.setValue(today(), false);
        
    
);
dateBox.getDatePicker().addShowRangeHandler(new ShowRangeHandler<Date>()

    @Override
    public void onShowRange(final ShowRangeEvent<Date> dateShowRangeEvent)
    
        final Date today = today();
        Date d = zeroTime(dateShowRangeEvent.getStart());
        while (d.before(today))
        
            dateBox.getDatePicker().setTransientEnabledOnDates(false, d);
            d = nextDay(d);
        
    
);

为了完整起见,这里是用于操作日期的 static 辅助方法:

private static Date today()

    return zeroTime(new Date());


/** this is important to get rid of the time portion, including ms */
private static Date zeroTime(final Date date)

    return DateTimeFormat.getFormat("yyyyMMdd").parse(DateTimeFormat.getFormat("yyyyMMdd").format(date));


private static Date nextDay(final Date date)

    return zeroTime(new Date(date.getTime() + 24 * 60 * 60 * 1000));

【讨论】:

很好的答案,但我想解决 onShowRangeHandler 方法中的一个小错误。循环还应该限制在结束范围内(否则会引发静默的开发环境断言异常)` final long endTime = event.getEnd().getTime(); while (d.before(today) && d.getTime() 另外,在从夏令时到标准时间的转换过程中,这段代码会进入一个无限循环 请使用com.google.gwt.user.datepicker.client.CalendarUtil 为当前日期增加一天:CalendarUtil.addDaysToDate (d, 1);。这也适用于从夏令时到标准时间的更改,反之亦然。而且您不必应付时间部分!【参考方案2】:

我在这里猜测,但您可能需要使用 addValueChangeHandler。一个例子:

datebox.addValueChangeHandler(new ValueChangeHandler<Date>() 
    public void onValueChange(ValueChangeEvent<Date> event) 
        Date date = event.getValue();
        if (date.before(new Date())) 
         fromDatePicker.setValue(new Date());
        
    
);

当用户以某种方式选择过去的日期时,它会自动将其设置为当前日期(或任何适合您需要的日期)。

【讨论】:

我宁愿只是禁用过去的任何日期,并避免他们选择一个的可能性。有没有办法禁用日历小部件中的实际可点击日期? 这是在正确的轨道上,但它本身就有缺陷。由于new Date() 与它相关联的时间,date.before(new Date())总是失败。我不得不抽出时间让这种方法发挥作用。现在我可以将日期重置为今天,但我仍在寻找完全禁用过去日期的方法。

以上是关于如何使用 com.google.gwt.user.datepicker.client.DateBox 限制可用的日期范围的主要内容,如果未能解决你的问题,请参考以下文章

GWT - 偶尔出现 com.google.gwt.user.client.rpc.SerializationException

java.lang.ClassNotFoundException: com.google.gwt.user.client.rpc.RemoteService

尽早避免 GWT 的 com.google.gwt.user.client.rpc.SerializationException 的最佳实践

“com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException”出现在控制台上

Core Exception [code 0] Invocation of com.google.gwt.user.tools.WebAppCreator failed这是啥问题啊

GWT Servlet 错误 com.google.gwt.user.client.rpc .StatusCodeException: Tomcat 服务器上的 404