NetBeans中使用addDateEvaluator()后如何重新启用JCalendar按钮
问题原因
你调用removeDateEvaluator()不生效的核心原因是:两次创建的DayOfWeekEvaluator是完全独立的对象实例。JCalendar的评估器添加、移除逻辑是按对象引用匹配的,你在移除时新创建的实例从来没有被添加到评估器列表中,自然无法匹配移除之前添加的规则。
解决方法
你只需要将用到的DayOfWeekEvaluator实例存储为类的成员变量,确保添加和移除操作使用的是同一个实例即可,具体修改如下:
- 在你的窗体类中添加成员变量,存储评估器实例:
// 存储自定义日期评估器的全局实例 private DayOfWeekEvaluator dayOfWeekEvaluator;
- 修改禁用日期的按钮逻辑,只实例化一次评估器:
private void jButtonActionPerformed(java.awt.event.ActionEvent evt) { List<DayOfWeek> invalidDays = Arrays.asList(DayOfWeek.MONDAY, DayOfWeek.FRIDAY); dayOfWeekEvaluator = new DayOfWeekEvaluator(invalidDays); JCalendar.getDayChooser().addDateEvaluator(dayOfWeekEvaluator); JCalendar.setCalendar(JCalendar.getCalendar()); }
- 修改启用日期的按钮逻辑,直接使用存储的实例执行移除:
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { if (dayOfWeekEvaluator != null) { JCalendar.getDayChooser().removeDateEvaluator(dayOfWeekEvaluator); dayOfWeekEvaluator = null; JCalendar.setCalendar(JCalendar.getCalendar()); } }
可选优化方案
如果你需要频繁切换禁用/启用指定日期的状态,也可以不用反复添加、移除评估器:在DayOfWeekEvaluator类中新增一个boolean类型的开关属性,重写接口要求的isValid方法时先判断开关状态即可,避免频繁操作评估器列表带来的不必要开销。
内容的提问来源于stack exchange,提问作者Guilerme
相关产品推荐
相关产品推荐

