禁用多个日期范围jDateChooser

我想在JCalendar上禁用多个日期范围。 我正在执行这些步骤 ,但我需要知道如何添加多个日期评估程序。 请帮帮我,谢谢。

更新:我不知道为什么我无法禁用JCalendar上的日期。 我会把我的代码留在这里,以便你们可以检查它。

这是我的RangeEvaluator类,从这个类修改。

class RangeEvaluator implements IDateEvaluator { private DateUtil dateUtil = new DateUtil(); @Override public boolean isSpecial(Date date) { return false; } @Override public Color getSpecialForegroundColor() { return null; } @Override public Color getSpecialBackroundColor() { return null; } @Override public String getSpecialTooltip() { return null; } @Override public boolean isInvalid(Date date) { return dateUtil.checkDate(date); // if the given date is in the range then is invalid } /** * Sets the initial date in the range to be validated. * @param startDate */ public void setStartDate(Date startDate) { dateUtil.setMinSelectableDate(startDate); } /** * @return the initial date in the range to be validated. */ public Date getStartDate() { return dateUtil.getMinSelectableDate(); } /** * Sets the final date in the range to be validated. * @param endDate */ public void setEndDate(Date endDate) { dateUtil.setMaxSelectableDate(endDate); } /** * @return the final date in the range to be validated. */ public Date getEndDate() { return dateUtil.getMaxSelectableDate(); } @Override public String getInvalidTooltip() { return null; } @Override public Color getInvalidBackroundColor() { return null; } @Override public Color getInvalidForegroundColor() { return null; } } 

以下是我使用RangeEvaluator类的方法:

  RangeEvaluator evaluator = new RangeEvaluator(); SimpleDateFormat dateFormat = new SimpleDateFormat("dd-mm-yyyy"); evaluator.setStartDate(dateFormat.parse("11-09-2014")); evaluator.setEndDate(dateFormat.parse("15-09-2014")); jCalendar1.getDayChooser().addDateEvaluator(evaluator); 

我错过了什么吗? 请帮帮我,谢谢。

根据您的更新,这里发生了两件事。

首先是你的SimpleDateFormat实例化时的一个小错误:

 SimpleDateFormat dateFormat = new SimpleDateFormat("dd-mm-yyyy"); 

在这种模式中,“mm”是指分钟而不是几个月 。 它应该是:

 SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); 

第二个问题是恕我直言,因为日期选择器似乎不会应用filter,直到设置新的日期或因为月/年更改而必须重新绘制。 你可以测试它改变月份到8月然后回到9月:9月11日到9月15日的日期将被禁用。 要解决这个不方便的行为,只需明确地设置当前日期:

 JCalendar calendar = new JCalendar(); calendar.getDayChooser().addDateEvaluator(evaluator); calendar.setDate(Calendar.getInstance().getTime()); 

旁注:虽然这个库非常有用但它有一些bug /设计问题所以请不要犹豫,寻求帮助。

只需为您创建的每个RangeEvaluator调用addDateEvaluator() 。 这会将RangeEvaluator添加到RangeEvaluator中的List dateEvaluators JDayChooser 。 之后, JDayChooser在决定如何绘制日期按钮时迭代列表。

编辑:这是我使用的RangeEvaluator

 private static class RangeEvaluator extends MinMaxDateEvaluator { @Override public boolean isInvalid(Date date) { return !super.isInvalid(date); } } 

这就是我如何使用它。

 RangeEvaluator re = new RangeEvaluator(); re.setMinSelectableDate(...); re.setMaxSelectableDate(...); JCalendar jc = new JCalendar(); jc.getDayChooser().addDateEvaluator(re); 

我注意到的一个问题是你必须告诉JDayChooser使用新的评估器重新配置它的按钮。 您可以触发属性更改事件或仅更改绑定属性。

 jc.setCalendar(jc.getCalendar());