2011-04-13 60 views

回答

17

根据我收到的建议,这里是我提出的将可选日期限制在当前日期和之后的工作。这适用于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)); 
} 
+3

很好的答案,但我想解决onShowRangeHandler方法中的一个小错误。循环也应该结束到结束范围(否则引发无声的开发环境声明异常)'\t final long endTime = event.getEnd()。getTime(); (d.before(today)&& d.getTime()<= endTime) { dateBox.getDatePicker()。setTransientEnabledOnDates(false,d); d = nextDay(d); } ' – Chris 2011-06-09 08:01:40

+0

此外,在从日光时间过渡到标准时间时,此代码将进入无限循环 – 2016-11-10 20:25:05

1

我在这里猜测,但你可能需要使用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()); 
     } 
    } 
}); 

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

+0

我宁愿只是_disable_在过去的任何日期,避免它们的可能性选择一个。有没有办法禁用日历小部件中的实际可点击日期? – 2011-04-13 22:56:22

+0

这是正确的轨道,但它本质上有缺陷。由于'new Date()'有时间关联,所以'date.before(new Date())'将会__always__失败。我不得不剥去时间来实现这种方法。现在我可以将日期重置为今天,但我仍然在寻找一种完全禁用过去日期的方法。 – 2011-04-13 23:46:45