2011-04-13 28 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