毕业设计 基于Java GUI 的万年历系统的设计与实现_第1页
毕业设计 基于Java GUI 的万年历系统的设计与实现_第2页
毕业设计 基于Java GUI 的万年历系统的设计与实现_第3页
毕业设计 基于Java GUI 的万年历系统的设计与实现_第4页
毕业设计 基于Java GUI 的万年历系统的设计与实现_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目 录1 需求分析32 总体设计42.1 设计的总体思想与算法描述42.2 模块结构图5用户查询主界面设计模块5用户输入查询日历模块6农历与公历日期信息转换模块6相应日期节日信息显示模块7查询主界面效果更换模块72.3 各模块的功能与处理流程描述8用户查询主界面设计模块功能和处理流程8用户输入查询日历模块9公历和农历日期信息转换模块9相应日期节日信息显示模块9查询主界面效果更换模块102.4 界面设计10万年历初始化界面10特定的日期查询界面11特定的日期节日显示界面(如春节、元宵节)12特定的农历和公历日期信息转换界面13查询主界面换肤功能展示界面143 各功能模块程序设计163.1 查询主

2、界面布局设计部分截取代码163.2 公历日期求解算法程序截取代码183.3 农历与公历转换算法程序截取代码213.4 节日求解算法程序实现截取代码264 小 结285 参考文献29题目:基于Java GUI 的万年历系统的设计与实现开发平台 :eclipse1 需求分析本系统所描述的万年历系统主要是基于Java GUI 来实现的。其主要功能是致力于为用户提供方便快捷、准确的日历时间信息,以便用户能够迅速地查找出自己所需的相关日历信息。本万年历系统主要的功能和任务是任意选择一段时间内的某个年份月份进行查询,对相关的日历信息进行公历和农历的换算显示,显示相应日期的节日信息等。功能描述:(1)日历查

3、询实现:主要通过主界面顶端的两个下拉列表框来选择相应待查询的年份和月份以实现具体的月份的日历查询。(2)公历和农历的时间换算:当把鼠标指针指向日历表里的某个具体日期数字上时,会自动显示相关的农历年份、月份、和生肖的相关信息。(3)节日信息的显示:当某个日期为某个特定的节日时,相应的日期数字所在表格会显示该节日信息,包括了阳历和农历节日。(4)界面皮肤更改功能:当要更改界面皮肤颜色时,只需要点击界面右上角的颜色按钮就可以更改相应的颜色,是界面外观效果得到改善。2 总体设计依据需求分析的结果,万年历系统应设计成一个适合于用户查询需求的、易于操作的查询系统软件,下面从软件的整体结构设计、接口设计等方

4、面阐述一下系统的总体设计。2.1 设计的总体思想与算法描述依据查询需求分析,万年历系统主要可以分为以下几个功能模块:用户查询主界面设计模块、用户输入查询日历模块、公历与农历日期信息转换模块、相应日期节日信息显示模块和查询主界面效果更换模块。主要的算法有农历和公历的换算算法,公历日期号与星期的求解算法,相应节日信息的生成算法,界面换肤算法,实时日期显示算法等。系统总功能模块如图2-1所示:万年历查询系统用户查询主界面设计模块用户输入查询日历模块农历与公历日期信息转换模块相应日期节日信息显示模块查询主界面效果更换模块图2-1 系统总功能模块图2.2 模块结构图2.2.1 用户查询主界面设计模块 该

5、模块主要是将用户查询主界面按BorderLayout方式分成几个主要区域,再对每个区域的组件进行分区布局。用户查询主界面设计模块主界面北部模块设计主界面中部模块设计北中部模块设计北南部模块设计中北部模块设计中南部模块设计中中部模块设计图2-2 用户查询主界面模块图 用户输入查询日历模块该模块主要是通过两个下拉列表框来让用户选择相应的要查询的年份和月份,另外还可以通过“今天”按钮迅速返回当天的日历信息。用户输入查询日历模块年份下拉列表框月份下拉列表框当天日期返回按钮图2-3 用户输入查询日历模块图2.2.3 农历与公历日期信息转换模块该模块主要用于对用户选择的日历信息进行农历和阳历之间的转换,当

6、用户把鼠标指针指向相应的日期时会自动出现显示相应农历信息的消息框。公历日期信息显示模块农历日期信息显示模块鼠标指向日期图2-4 农历与公历日期信息转换示意图2.2.4 相应日期节日信息显示模块该模块主要用于对某个特定的日期节日信息进行显示,当查询到某个日历表时,相应日历月份的节日信息会自动显示在日期数字表格内。公历日期信显示模块息公历与农历节日显示模块图2-5 相应节日信息显示模块示意图2.2.5 查询主界面效果更换模块 该模块主要用于更改查询界面的皮肤效果,主要有红、黄、蓝、绿四个主要界面效果。主界面皮肤效果更换模块红色按钮控件显示红色皮肤蓝色按钮控件显示蓝色皮肤绿色按钮控件显示绿色皮肤默认

7、按钮空间恢复默认皮肤样式黄色按钮控件显示黄色皮肤图2-6查询主界面效果更换模块示意图2.3 各模块的功能与处理流程描述 用户查询主界面设计模块功能和处理流程该模块主要按照java GUI 程序设计中的BorderLayout布局方式,首先将主界面分成东、西、南、北、中五个区域,其中忽略东部和西部两个区域的布局,将主界面分成了北部、中部和南部三个区域。然后就这三个主要区域进行分别地布局管理。北部区域又按照BorderLayout布局方式将其分为中部区域和南部区域。其中的中部区域添加了三个标签,分别为label1(提示标签)、label2(“年”)和label3(“月”),还有两个下拉列表框com

8、boBoxYear和comboBoxMonth分别用来给用户选择要查询的年份和月份。其中的南部区域则按FlowLayout布局方式添加了五个按钮,分别为button1、button2、button3、button4和button5,分别通过添加相应的ActionEvent事件来实现对界面肤色的改变功能。中部区域又按照BorderLayout布局方式将其分为北部区域、中部区域和南部区域。其中的北部区域用FlowLayout布局方式添加了一个按钮button6和一个标签label4,按钮用来返回当天的日期信息,标签用来显示当天日期和系统具体时间信息。中部区域按GridLayout布局方式添加了7*

9、7个标签,分别用来显示相应的星期和每月当中具体的每天的号数和节日等信息,属于整个界面中最核心的部位。南部区域按FlowLayout布局方式添加了一个标签label5用来显示相应的提示和版权信息。2.3.2 用户输入查询日历模块该模块属于整个万年历系统中最为核心的模块。用户通过两个下拉列表框来选择相应要查询的月份和年份,然后系统会自动把对应的年份中的月份所有信息显示在日历表格中。通过日历表格显示的信息,用户可以清楚的知道一年中的每个月份、每一天的公历、农历的信息和相应的节日信息。公历信息和所有的节日信息都自动地显示在了日历表格中,农历信息则只需要用户将鼠标停留在相应的公历日期号数上就会自动出现一

10、个信息框来显示。该模块当属整个系统中算法最为复杂的模块。主要用到了公历日期求解算法、公历和农历转换算法、节日求解和添加算法,具体算法求解程序请参考3部分的各功能模块程序设计。2.3.3 公历和农历日期信息转换模块该模块主要通过公历和农历转换算法来实现了用户可以通过公历日期信息来获取相应的农历日期和节日信息的功能。具体算法求解程序参见3部分的程序代码。2.3.4 相应日期节日信息显示模块该模块主要通过节日求解算法和将节日信息添加显示到日期数字表格中的功能代码来实现了显示公历和农历节日信息的功能。具体算法求解程序参见3部分的程序代码。 查询主界面效果更换模块该模块主要通过给五个按钮添加相应的事件响

11、应代码程序来实现了给查询主界面更换肤色效果的功能。具体的算法实现程序参见3部分的程序代码。2.4 界面设计 万年历初始化界面图2-7 万年历初始化界面 特定的日期查询界面图2-8 特定日期查询界面(如2020年1月3号) 特定的日期节日显示界面(如春节、元宵节)图2-9特定的日期节日显示界面(如春节、元宵节等) 特定的农历和公历日期信息转换界面图2-10特定的农历和公历日期信息转换界面 查询主界面换肤功能展示界面图2-11查询主界面换肤功能展示界面一图2-12查询主界面换肤功能展示界面二图2-13查询主界面换肤功能展示界面二 3 各功能模块程序设计 3.1 查询主界面布局设计部分截取代码pan

12、elCenter = new JPanel(new BorderLayout();panelCenterNorth = new JPanel(new FlowLayout(FlowLayout.CENTER);panelCenterNorth.setBorder(BorderFactory.createEtchedBorder();final JButton button6 = new JButton("今天");button6.addActionListener(new ActionListener()public void actionPerformed(ActionE

13、vent e)if(e.getSource()=button6)try updateMonthDays(y, m); catch (ParseException e1) / TODO Auto-generated catch blocke1.printStackTrace(); comboBoxMonth.setSelectedIndex(m-1); comboBoxYear.setSelectedIndex(y-1901););panelCenterNorth.add(button6);label4 = new JLabel("",JLabel.CENTER);label

14、4.setText("北京时间:"+str);label4.add(new Clock(this);panelCenterNorth.add(label4);panelCenter.add(panelCenterNorth,BorderLayout.NORTH);panelCenters = new JPanel(new GridLayout(7,7,3,3);panelCenters.setBorder(BorderFactory.createEtchedBorder(); for(int i=0;i<7;i+) labeli=new JLabel(weekdays

15、i,JLabel.CENTER); labeli.setFont(font2); labeli.setForeground(Color.blue); labeli.setBorder(BorderFactory.createEtchedBorder(); panelCenters.add(labeli); for(int i=7;i<49;i+) labeli=new JLabel("",JLabel.CENTER); labeli.setFont(font1); labeli.setForeground(Color.blue); labeli.setBorder(B

16、orderFactory.createEtchedBorder(); panelCenters.add(labeli); panelCenter.add(panelCenters,BorderLayout.CENTER);panelCenterSouth = new JPanel();panelCenterSouth.setBorder(BorderFactory.createEtchedBorder();JLabel label5 = new JLabel("<html><body><p align=center>提示:将鼠标停留在日历表的日期数

17、字上会有相应的农历信息显示。</p><p align=center>版权所有:08信管 王涵</p></body></html>",JLabel.CENTER);label5.setFont(font4);panelCenterSouth.add(label5);panelCenter.add(panelCenterSouth,BorderLayout.SOUTH);contentPane.add(panelCenter,BorderLayout.CENTER);/*/南部panelSouth = new JPanel();

18、contentPane.add(panelSouth,BorderLayout.SOUTH);/西部panelWest = new JPanel();contentPane.add(panelWest,BorderLayout.WEST);/东部panelEast = new JPanel();contentPane.add(panelEast,BorderLayout.EAST);*/this.updateMonthDays(y, m); /初始化月份显示为当前月份comboBoxMonth.setSelectedIndex(m-1); / 设置下拉列表显示为当前月comboBoxYear.

19、setSelectedIndex(y-1901); / 设置下拉列表显示为当前年 3.2 公历日期求解算法程序截取代码public int allDays(int year,int month)int daysA = 0,daysB = 0,allDays; /daysA表示输入年份到1900年经过的天数;daysB表示当年一月一号到输入月份的天数(不包括当月) for (int n=1900;n<year;n+) /输入年份到1900年经过的天数和计算开始 if(n%4 = 0 && n%100 != 0) |n%400 = 0) daysA = daysA + 366

20、; else daysA = daysA + 365; /输入年份到1900年经过的天数和计算结束 for (int y=1;y<month;y+) /当年1月1号到输入月份经过的天数(不包含当月)和计算开始 switch(y) case 1: daysB = daysB +31; break; case 3: daysB = daysB +31; break; case 5: daysB = daysB +31; break; case 7: daysB = daysB +31; break; case 8: daysB = daysB +31; break; case 10: day

21、sB = daysB +31; break; case 12: daysB = daysB +31; break; case 4: daysB = daysB +30; break; case 6: daysB = daysB +30; break; case 9: daysB = daysB +30; break; case 11: daysB = daysB +30; break; case 2: if(year%4 = 0 && year%100 != 0) |year%400 = 0) daysB = daysB + 29; else daysB = daysB + 2

22、8; break; /当年1月1号到输入月份经过的天数(不包含当月)和计算结束 allDays =daysA + daysB; /输入年份和月份到1900年1月1号经过的天数(不包含当月)和计算 return allDays;public void updateMonthDays(int year,int month) throws ParseExceptionint allDays = this.allDays(year, month);int theFirstDayOfMonth = 1+allDays%7; /判断输入的当月的一号是星期几 if(month=1|month=3|month

23、=5|month=7|month=8|month=10|month=12) /判断输入的月份是不是大月 for(int i = 0;i < theFirstDayOfMonth;i+) /判断并在当月1号前标签里输出为空 if(theFirstDayOfMonth!=7) /如果当月1号是星期天就不在前面标签里输出空 labeli+7.setText(null); else theFirstDayOfMonth=0; break; for(int j=1;j<=31;j+) if(Holiday.holiday(year, month, j).equals("0"

24、;) labelj+6+theFirstDayOfMonth.setText(Integer.toString(j); try labelj+6+theFirstDayOfMonth.setToolTipText(LunarString.lunarString(year+"年"+month+"月"+j+"日"); catch (ParseException e) e.printStackTrace(); if(allDays+j)%7=0|(allDays+j)%7=6) labelj+6+theFirstDayOfMonth.set

25、Foreground(Color.red); if(year=y&&month=m&&j=d) labelj+6+theFirstDayOfMonth.setForeground(Color.GREEN); labelj+6+theFirstDayOfMonth.setBackground(Color.GREEN); labelj+6+theFirstDayOfMonth.setFont(new Font("楷体-GB2312",Font.ITALIC+Font.BOLD,20); else labelj+6+theFirstDayOfMon

26、th.setText("<html><body>"+Integer.toString(j)+Holiday.holiday(year, month, j)+"</body></html>"); labelj+6+theFirstDayOfMonth.setForeground(new Color(255,51,255); labelj+6+theFirstDayOfMonth.setFont(font3); try labelj+6+theFirstDayOfMonth.setToolTipText(Lun

27、arString.lunarString(year+"年"+month+"月"+j+"日"); catch (ParseException e) e.printStackTrace(); if(year=y&&month=m&&j=d) labelj+6+theFirstDayOfMonth.setForeground(Color.GREEN); labelj+6+theFirstDayOfMonth.setBackground(Color.GREEN); labelj+6+theFirstDayOfM

28、onth.setFont(new Font("楷体-GB2312",Font.ITALIC+Font.BOLD,12); 3.3 农历与公历转换算法程序截取代码class Lunar private int year; private int month; private int day; private boolean leap; final static String chineseNumber = "正", "二", "三", "四", "五", "六&quo

29、t;, "七", "八", "九", "十", "十一", "腊" final static String chineseNumber1 = "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", &qu

30、ot;十二" static SimpleDateFormat chineseDateFormat = new SimpleDateFormat("yyyy年MM月dd日"); final static long lunarInfo = new long 0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2, 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ad

31、a2, 0x095b0, 0x14977, 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, 0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950, 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, 0x06ca0,

32、 0x0b550, 0x15355, 0x04da0, 0x0a5d0, 0x14573, 0x052d0, 0x0a9a8, 0x0e950, 0x06aa0, 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, 0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b5a0, 0x195a6, 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x

33、0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570, 0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x055c0, 0x0ab60, 0x096d5, 0x092e0, 0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5, 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x151

34、76, 0x052b0, 0x0a930, 0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, 0x05aa0, 0x076a3, 0x096d0, 0x04bd7, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, 0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0; /= 传回农历

35、y年的总天数 final private static int yearDays(int y) int i, sum = 348; for (i = 0x8000; i > 0x8; i >>= 1) if (lunarInfoy - 1900 & i) != 0) sum += 1; return (sum + leapDays(y); /= 传回农历 y年闰月的天数 final private static int leapDays(int y) if (leapMonth(y) != 0) if (lunarInfoy - 1900 & 0x10000)

36、 != 0) return 30; else return 29; else return 0; /= 传回农历 y年闰哪个月 1-12 , 没闰传回 0 final private static int leapMonth(int y) return (int) (lunarInfoy - 1900 & 0xf); /= 传回农历 y年m月的总天数 final static int monthDays(int y, int m) if (lunarInfoy - 1900 & (0x10000 >> m) = 0) return 29; else return 3

37、0; /= 传回农历 y年的生肖 final public String animalsYear() final String Animals = new String"鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪" return Animals(year - 4) % 12; /= 传入

38、月日的offset 传回干支, 0=甲子 final private static String cyclicalm(int num) final String Gan = new String"甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸" final String Zhi = new String"子", "丑&qu

39、ot;, "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥" return (Gannum % 10 + Zhinum % 12); /= 传入 offset 传回干支, 0=甲子 final public String cyclical() int num = year - 1900 + 36; return (cyclicalm(num); pub

40、lic Lunar(Calendar cal) int yearCyl, monCyl, dayCyl; int leapMonth = 0; Date baseDate = null; try baseDate = chineseDateFormat.parse("1900年1月31日"); catch (ParseException e) e.printStackTrace(); /To change body of catch statement use Options | File Templates. /求出和1900年1月31日相差的天数 int offset

41、= (int) (cal.getTime().getTime() - baseDate.getTime() / 86400000L); dayCyl = offset + 40; monCyl = 14; int iYear, daysOfYear = 0; for (iYear = 1900; iYear < 2050 && offset > 0; iYear+) daysOfYear = yearDays(iYear); offset -= daysOfYear; monCyl += 12; if (offset < 0) offset += daysOf

42、Year; iYear-; monCyl -= 12; /农历年份 year = iYear; yearCyl = iYear - 1864; leapMonth = leapMonth(iYear); /闰哪个月,1-12 leap = false; /用当年的天数offset,逐个减去每月(农历)的天数,求出当天是本月的第几天 int iMonth, daysOfMonth = 0; for (iMonth = 1; iMonth < 13 && offset > 0; iMonth+) /闰月 if (leapMonth > 0 && i

43、Month = (leapMonth + 1) && !leap) -iMonth; leap = true; daysOfMonth = leapDays(year); else daysOfMonth = monthDays(year, iMonth); offset -= daysOfMonth; /解除闰月 if (leap && iMonth = (leapMonth + 1) leap = false; if (!leap) monCyl+; /offset为0时,并且刚才计算的月份是闰月,要校正 if (offset = 0 &&

44、leapMonth > 0 && iMonth = leapMonth + 1) if (leap) leap = false; else leap = true; -iMonth; -monCyl; /offset小于0时,也要校正 if (offset < 0) offset += daysOfMonth; -iMonth; -monCyl; month = iMonth; day = offset + 1; public static String getChinaDayString(int day) String chineseTen = "初&q

45、uot;, "十", "廿", "卅" int n = day % 10 = 0 ? 9 : day % 10 - 1; if (day > 30) return "" if (day = 10) return "初十" else return chineseTenday / 10 + chineseNumber1n; public String toString() return (leap ? "闰" : "") + chineseNumberm

46、onth - 1 + "月" + getChinaDayString(day); public String getChinaWeekdayString(String weekday) if(weekday.equals("Mon") return "一" if(weekday.equals("Tue") return "二" if(weekday.equals("Wed") return "三" if(weekday.equals("Thu&q

47、uot;) return "四" if(weekday.equals("Fri") return "五" if(weekday.equals("Sat") return "六" if(weekday.equals("Sun") return "日" else return "" 3.4 节日求解算法程序实现截取代码class Holiday private static String strHoliday; private static

48、 String strLunarHoliday; private static String strNoLunarHoliday; static String holiday(int year,int month,int day) throws ParseExceptionif(month=1|month=3|month=5|month=7|month=8|month=10|month=12)if(month=1&&day=1)strNoLunarHoliday ="元旦节"else if(month=3&&day=8)strNoLunarH

49、oliday ="妇女节"else if(month=5&&day=1)strNoLunarHoliday ="劳动节"else if(month=7&&day=1)strNoLunarHoliday ="党生日"else if(month=8&&day=1)strNoLunarHoliday ="建军节"else if(month=10&&day=1)strNoLunarHoliday ="国庆节"else if(month=12

50、&&day=24)strNoLunarHoliday ="平安夜"else if(month=12&&day=25)strNoLunarHoliday ="圣诞节"elsestrNoLunarHoliday ="0"else if(month=2&&day=14)strNoLunarHoliday ="情人节"else if(month=4&&day=5)strNoLunarHoliday ="清明节" else if(month=6&&day=1) strNoLunarHoliday ="儿童节"else if(month=9&&day=10)strNoLunarHoliday ="教师节"elsestrNoLunarHoliday ="0" if("正月初一".equals(LunarString.lunarHolidayString(year, month, day) strLunarHoliday="春节

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论