最近用java做一个很简单的桌面应用,居然发现连一个好用的日历组件/控件都找不到,郁闷……
于是自己做了一个简单的,现在放出来共享吧!
呃……其实这个也不完全是自己做的,修改自一个网上下回来的日历组件(似乎是多年前开发的了),不过原版不是很好用,我进行了重构和增强,估计已经很难看出跟原版的关系了……
这个组件以jar的形式发布,源代码也在里面。直接运行即可看到演示效果。
由于使用了枚举(enum),所以需要java5.0才能编译运行。
大家可以随便使用、修改,不过最好把修改后的源码发回来给我,谢谢啦!
以下运行截图均运行于Kubuntu Linux 5.10+JRE 5.0系统中。
直接运行效果:
实例效果(使用了第三方laf):
点击这里下载
基本功能
可以选择日期,直接选择当天;
支持在改变日期时以及选择日期后的简单事件处理。
编程接口
组件使用Eclipse3.1.1+JDK5.0开发并测试通过。
所有类放在包:addone.publics.gui.calendar中:
- WeekDay类:操作周日的Enum
- CalendarColors类:定义了日历的外观颜色常数
- CellSelectionListener类:选中表格单元格后的侦听器
- CellChangeListener类:表格单元格改变后的侦听器
- CalendarSelectionListener类:在日历中选中日期后的侦听器
- CellChangeListener类:日历日期改变后的侦听器
- CalendarTable类:日历表格,封装了表格操作方法,继承自JTable
- CalendarPanel类:日历面板,封装了大部分的组件操作方法,继承自JPanel
基本用法(CalendarPanel类):
CalendarPanel():构造一个以星期天为每周的第一天的日历
CalendarPanel(WeekDay):构造一个以WeekDay为每周的第一天的日历
WeekDay getStartWeekDay():返回当前日历每周的第一天
Calendar getCalendar():返回组件内部当前的Calendar对象
void setCalendar(Calendar calendar):重新设置组件内部的calendar对象,并刷新日历
void setToday():日历跳转到当前日期,同时刷新日历
void setCalendarChangeListener(CalendarChangeListener listener):设置日历日期改变时的侦听器,当改变年份或月份时,以及选中日期但尚未跳转时触发
void setCalendarSelectionListener(CalendarSelectionListener listener):设置日历日期选中时的侦听器,当直接在日历中选中日期并跳转后,或者直接回到今天时触发
如果需要改变日历的外观颜色,直接修改CalendarColors类中的颜色常数即可。
简单示例
以下代码创建了一个Frame,其中放置了一个日历组件,日历设置为以星期一为每周的第一天。
public class CalendarFrame extends JFrame {
private CalendarPanel myCalendar;
public CalendarFrame() {
initCalendar();
initFrame();
pack();
}
private void initCalendar() {
myCalendar = new CalendarPanel(WeekDay.MONDAY);
myCalendar.setCalendarSelectionListener(new CalendarSelectionListener() {
public void calendarSelected(Calendar currentCalendar) {
System.out.println(currentCalendar.get(Calendar.YEAR)+"-"
+(currentCalendar.get(Calendar.MONTH)+1)+"-"
+currentCalendar.get(Calendar.DATE));
};
});
myCalendar.setCalendarChangeListener(new CalendarChangeListener() {
public void calendarChanged() {
System.out.println("Changing");
};
add(myCalendar);
}
private void initFrame() {
setTitle("日历");
setSize(400, 172);
setResizable(false);
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
}
}