You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NetBeans中使用addDateEvaluator()后如何重新启用JCalendar按钮

问题原因

你调用removeDateEvaluator()不生效的核心原因是:两次创建的DayOfWeekEvaluator是完全独立的对象实例。JCalendar的评估器添加、移除逻辑是按对象引用匹配的,你在移除时新创建的实例从来没有被添加到评估器列表中,自然无法匹配移除之前添加的规则。

解决方法

你只需要将用到的DayOfWeekEvaluator实例存储为类的成员变量,确保添加和移除操作使用的是同一个实例即可,具体修改如下:

  1. 在你的窗体类中添加成员变量,存储评估器实例:
// 存储自定义日期评估器的全局实例
private DayOfWeekEvaluator dayOfWeekEvaluator;
  1. 修改禁用日期的按钮逻辑,只实例化一次评估器:
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());
}
  1. 修改启用日期的按钮逻辑,直接使用存储的实例执行移除:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 07:06:09