Java 在JXDatePicker/JXMonthView中禁用日期

Java 在JXDatePicker/JXMonthView中禁用日期,java,swing,swingx,Java,Swing,Swingx,我正在编写的程序允许用户单击JXDatePicker上的日期来设置任务完成的日期。我想在JXDatePicker中禁用未来日期的选择,因为在我的程序中选择未来日期是无效的 我发现JXDatePickers包含一个JXMonthView,而日期选择器或月份视图似乎不允许禁用单个/范围的日期。我可以更改各个日期和日期范围的背景颜色,这应该允许我将未来的日期设置为单独的颜色。然后,每当用户单击日历时,我可以添加一些验证,以禁止将来的日期。然而,如果我能说像calendar.setMaxDate(今天)

我正在编写的程序允许用户单击JXDatePicker上的日期来设置任务完成的日期。我想在JXDatePicker中禁用未来日期的选择,因为在我的程序中选择未来日期是无效的

我发现JXDatePickers包含一个JXMonthView,而日期选择器或月份视图似乎不允许禁用单个/范围的日期。我可以更改各个日期和日期范围的背景颜色,这应该允许我将未来的日期设置为单独的颜色。然后,每当用户单击日历时,我可以添加一些验证,以禁止将来的日期。然而,如果我能说像calendar.setMaxDate(今天)这样的话,它会更干净


有人知道有没有比手工编写功能更简单的方法?也许另一个日期选择器组件解决了这个问题?

经过几分钟的研究,JDatePicker似乎可以在这里工作-请参阅


不过,如果有人知道一种简单的方法,仍然可以建议使用JXDatePickers来完成此操作。

如果要将日期选择限制在一个范围内,可以指定上限和下限

JXDatePicker picker = new JXDatePicker();
Calendar calendar = picker.getMonthView().getCalendar();
// starting today if we are in a hurry
calendar.setTime(new Date());
picker.getMonthView().setLowerBound(calendar.getTime());
// end of next week
CalendarUtils.endOfWeek(calendar);
calendar.add(Calendar.WEEK_OF_YEAR);
picker.getMonthView().setUpperBound(calendar.getTime());
(摘自JavaDocs)

这将基本上限制从今天到周末的有效、可选择的日期

package org.chillies.validator;
import java.util.Date;
@SuppressWarnings("deprecation")
public class DateValidator {
public Date getlowerBoundDate(){
    String date;
    Date date1=new Date();
    Integer year=1900+date1.getYear();
    date="01-Apr-"+year;
    return new Date(date);
}
public Date getupperBoundDate(){
    String date;
    Date date1=new Date();
    Integer year=1900+date1.getYear();
    date="31-Mar-"+(year+1);//you can set date as you wish over here
    return new Date(date);
 }
}
其余的代码是这样应用这个类的

datePicker.setBorder(null);
    DateValidator datevalidator=new DateValidator();
    datePicker.getMonthView().setLowerBound(datevalidator.getlowerBoundDate());
    datePicker.getMonthView().setUpperBound(datevalidator.getupperBoundDate());
Callback callB=new Callback(){
@凌驾
公共DateCell调用(最终日期选择器参数){
返回新的DateCell(){
@凌驾
public void updateItem(LocalDate项,布尔值为空){
super.updateItem(item,empty);//要更改生成的方法体,请选择工具|模板。
LocalDate today=LocalDate.now();
setDisable(空的| |项。比较到(今天)<0);
}
};
}
};
选择日期。设置日期单元格工厂(callB);

日期禁用……

太好了,这很好用。结果我看到的是过时的javadoc,看起来setLower/UpperBound还没有实现。非常感谢,这就是我一直在寻找的。我只是在不久前和它一起玩的时候才知道它在那里;)-我相信1.6.4现在是我们当前的版本
        Callback<DatePicker, DateCell> callB = new Callback<DatePicker, DateCell>() {
            @Override
            public DateCell call(final DatePicker param) {
                return new DateCell() {
                    @Override
                    public void updateItem(LocalDate item, boolean empty) {
                        super.updateItem(item, empty); //To change body of generated methods, choose Tools | Templates.
                        LocalDate today = LocalDate.now();
                        setDisable(empty || item.compareTo(today) < 0);
                    }

                };
            }

        };
        selectedDate.setDayCellFactory(callB);