万年历项目实现的是一款日历软件,它能够展示出任意年份的日历,除此之外,该软件还能以红色字体标出每个月的阳历节日。
21.1.1万年历功能简介
万年历软件的运行结果如图21-1所示。
图21-1万年历软件界面
为方便讲述,此处把这个万年历的界面分成了4个区域,每个区域当中都有很多个组件,源代码中也会以注释的形式指出各组件对象属于哪一个区域。
从图21-1可以看到:区域1显示了当前日期时间。这个当前时间是以中国的北京时间来显示的,并且每秒钟能自动刷新当前时间。如果希望显示其他时区的时间,用户可以用下拉框切换城市,本案例的选项中提供了四个较大的城市,分别是:北京、巴黎、纽约和悉尼,它们分别是亚洲、欧洲、美洲和大洋洲这4个大洲当中4个有代表性的城市。读者在掌握了万年历的运行原理后完全可以自己再添加一些其他城市。当从一个城市切换到另一个城市的时候,界面上所显示的时间也会发生变化。
区域2中有一行黑色的字,它指出了当前界面上所显示的日历是哪年哪月。有了这一行字,用户就知道现在界面上所显示的日历是哪年哪月,例如图21-1显示的就是2022年6月的日历。
区域3是界面的主体,它所显示的是某年某月的日历。在显示这个月的日历的同时,还会同时的显示上个月末尾的几天和下个月开头的几天。但本月的日历显示为黑色字体,而上个月末尾的几天和下个月开头的几天用灰色的字体显示。此外,日历主界面上还可以显示出当月重要的阳历节日,阳历节日用较小的红色字体显示,例如图21-1中显示的是儿童节。如果界面上的日期包含当前日期,也就是现实意义的“今天”,那么“今天”的日期将以蓝色字体显示。
区域4中是一些按钮和下拉框,这一部分组件用来对日历进行切换,用户可以通过这一组组件把日期切换到任何年月。在界面左下方有一个“回当前月”按钮,单击这个按钮就能回到当前这个月。此外,万年历软件能在切换城市时重新计算今天是几号。例如当前日期时间如果是北京时间2022年6月30日早上六点,日历界面上会以蓝色字体显示30日这个日期,如果用户把时区切换为纽约,则以纽约时间计算当前时间为6月29日,日历界面上会以蓝色字体显示29日。
21.1.2项目结构简介
万年历项目总共由3个类组成,它们分别是:
- CalendarFrame:日历窗体,是本项目最核心的类。
- MyCalendar:包含main()方法,最主要作用是从main()方法中创建一个日历窗体对象。
- Festival:表示阳历节日的类,日历中的阳历节日就是Festival类的对象。
万年历软件界面上有很多组件,这些组件均被定义成CalendarFrame类的属性,它们是:
//区域1:当前时间区
JLabel lblCTip;//当前日期指示时间标签
JLabel lblCurTime;//当前日期显示时间标签
JComboBox<String> jcbCities;//城市选择下拉框
DefaultComboBoxModel<String> citiesData;//城市名称
//区域2:日历显示年月
JLabel lblShowTip;//桌面日历显示年月标签
//区域3:日历主体部分
JLabel[] lblweekDays = new JLabel[7];
String[] strWeekDays = {"日","一","二","三","四","五","六"};
JLabel[] lblDates = new JLabel[42];
JLabel[] lblFestivals = new JLabel[42];
//区域4:功能按钮
JLabel lblSelectTip;//选择年月指示标签
JComboBox<String> jcbYears;//年份选择下拉框
DefaultComboBoxModel<String> yearsData;//年份
JLabel lblYearTip;//年标签
JButton btnCurYM;//回到当前月
JButton btnPreYear;//前1年
JButton btnNextYear;//后1年
JButton btnPreMonth;//前1月
JButton btnNextMonth;//后1月
JComboBox<String> jcbMonths;//月份选择下拉框
DefaultComboBoxModel<String> monthsData;//月份
JLabel lblMonthTip;//月标签
此外,很多公共资源也被定义为CalendarFrame类的属性,这样这些公共资源能够被多个方法所共用,例如日历上的节日名称就是一种公共资源,在任何一个方法中都可以调用它们。项目中的公共资源包括:
//4个城市的时区(北京、巴黎、纽约、悉尼)
ZoneId[] zids = {
ZoneId.of("Asia/Shanghai"),
ZoneId.of("Europe/Paris"),
ZoneId.of("America/Indianapolis"),
ZoneId.of("Australia/Sydney")
};
//当前时区下标
int zidIndex = 0;
//定义当前时间
ZonedDateTime curTime = ZonedDateTime.now(zids[zidIndex]);
//格式化工具
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//格式化当前时间形成的字符串
String strCurTime;
//定时器及定时器任务
Timer timer;
TimerTask task;
//日历显示的年月(YearMonth类对象)
YearMonth shownYM;
//阳历节日
Festival[][] festivals= {
{new Festival(1,1,"元旦")},
{new Festival(2,14,"情人节")},
{new Festival(3,8,"妇女节")},
{new Festival(4,1,"愚人节")},
{new Festival(5,1,"劳动节")},
{new Festival(6,1,"儿童节")},
{new Festival(7,1,"建党节")},
{new Festival(8,1,"建军节")},
{new Festival(9,10,"教师节")},
{new Festival(10,1,"国庆节")},
{new Festival(11,11,"光棍节")},
{new Festival(12,25,"圣诞节")}
};
读者先熟悉一下以上定义的这些组件和公共资源,这样后面在阅读代码时能够快速理解每个组件或资源的意义。
本文字版教程还配有更详细的视频讲解,小伙伴们可以点击这里观看。
标签:第二十一章,万年历,Festival,简介,日历,界面,new,JLabel From: https://blog.51cto.com/mugexuetang/5990324