Java万年历课程设计报告.doc_第1页
Java万年历课程设计报告.doc_第2页
Java万年历课程设计报告.doc_第3页
Java万年历课程设计报告.doc_第4页
Java万年历课程设计报告.doc_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

Java课程设计设计题目:万年历系 别: 计算机科学与工程学院 专 业: 信息管理与信息系统 学 号: 1100340116 姓 名: 岑少兵 指导教师: 汪华澄 时 间: 2013-6-29 目 录摘要3系统功能结构图31 系统模块设计41.1 需求设计41.2 开发和运行环境41.3 功能设计42 万年历详细设计思路4 2.1 程序设计思路5 2.2 程序运行主界面52.3 流程图63 各模块功能实现及代码说明6 3.1 MainFramel类6 3.2 Lunar类14 3.3 national类22 3.4 SetClock类26 4 小结 345 参考文献 34基于Myeclipse的万年历摘要:万年历是日常生活中不可或缺的小工具,用万年历我们可以准确地查到当前,以后或是过去的日期,极大地方便了我们的生活。在万年历上添加了显示本地时间以后会更加准确地显示时间。无论是对于我们学生还是上班族或是自由职业者需要经常查看和查找万年历来规划自己将要做得一些事情,或是回忆在过去的时间里已经做过的事情,使之更加有利于提升我们的学习或是工作进度。系统功能结构图:主要描述系统要实现的各个模块的功能。万年历世界时间闹钟查询星期农历北京时间纽约时间设置闹钟时间到,闹铃响查询年月日对应的星期关闭将农历与公历一起实现东京时间1系统模块设计11需求分析本程序的要求为:1.使用图形用户界面2.能够实现日期与星期的查询 3.能够显示农历 4.能够查看世界时间5.能够添加闹钟 12 开发和运行环境开发工具:Myeclipse运行环境: windows 7 13功能设计本程序要构建的万年历程序,其功能有以下几个方面: (1) 通过MainFrame类,实现图形界面和公历日期。(2) 提供年份、月份的下拉形式菜单来选择年份和月份。(3) 通过Lunar类实现农历日期。(4) 通过national类实现世界时间。(5) 能以月历形式显示日期与星期。 (6) 通过SetClock类来实现闹钟功能。(7) 通过点击世界时间按钮查询世界时间(8) 通过点击闹钟按钮设置闹钟(9) 显示系统当前时间和日期。(10) 显示作者信息。 2 万年历详细设计思路2.1程序设计思路1. 总天数的算法:首先用if语句判断定义年到输入年之间每一年是否为闰年,是闰年,该年的总天数为366,否则,为365。然后判断输入的年是否为定义年,若是,令总天数S=1,否则,用累加法计算出定义年到输入年之间的总天数,再把输入年的一月到要输出的月份之间的天数累加起来,若该月是闰年中的月份并且该月还大于二月,再使总天数加1,否则,不加,既算出从定义年一月一日到输出年的该月一日的总天数。 2. 输出月份第一天为星期几的算法:使总天数除以7取余加2得几既为星期几,若是7,则为星期日。3. 算出输出月份第一天为星期几的算法:算出输出月份第一天为星期几后,把该日期以前的位置用空格补上,并总该日起一次输出天数直到月底,该月中的天数加上该月一日为星期几的数字再除以7得0换行,即可完整的输出该月的日历。4. 如果年份小于1900年则程序不予判断。2.2程序运行主界面2.3流程图3 各模块功能实现及代码说明3.1 MainFrame类import java.awt.BorderLayout;import java.awt.Color;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.ItemEvent;import java.awt.event.ItemListener;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import javax.swing.JButton;import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.Timer;import aa.Lunar;public class MainFrame extends JFrame implements ItemListener/建立主界面 JPanel panel=new JPanel(new BorderLayout();/建立中层容器并布局 JPanel panel1=new JPanel(); JPanel panel2=new JPanel(new GridLayout(8,7); JPanel panel3=new JPanel(new GridLayout(4,1); JLabel label=new JLabel49;/标签 JLabel y_label=new JLabel(年); JLabel m_label=new JLabel(月); JLabel dashao =new JLabel(时间总是在不经意间溜走,我们还得向前走,JLabel.CENTER); JLabel bing =new JLabel(希望在回首时候,不带任何遗憾!,JLabel.CENTER); JLabel feng =new JLabel(桂电大烧饼制作!,JLabel.CENTER); JLabel labelTime=new JLabel(,JLabel.CENTER); JComboBox com1=new JComboBox();/下拉窗口 JComboBox com2=new JComboBox(); JButton but1=new JButton(闹钟); /按钮 JButton but2=new JButton(世界时间); Calendar now=Calendar.getInstance(); public MainFrame()/设置主界面,并添加各组件 super(大烧饼万年历); setSize(500,600); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); panel1.add(but1); panel1.add(y_label); panel1.add(com1); panel1.add(m_label); panel1.add(com2); panel1.add(but2); panel3.add(dashao); panel3.add(bing); panel3.add(feng); panel3.add(labelTime); for(int i=0;i49;i+)/日期标签 labeli=new JLabel(,JLabel.CENTER); panel2.add(labeli); panel.add(panel1,BorderLayout.NORTH);/中层容器布局 panel.add(panel2,BorderLayout.CENTER); panel.add(panel3,BorderLayout.SOUTH); setContentPane(panel); setVisible(true); init(); com1.addItemListener(this);/对下拉组件监听 com2.addItemListener(this); but1.addActionListener(new ActionListener() /按钮动作监听public void actionPerformed(ActionEvent e) new aa.SetClock(); /闹钟类 ); but2.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) new aa.national();/世界时间类 ); Timer timer = new Timer(1000, new ActionListener()/获得系统时间,并将其显示在主界面下方 public void actionPerformed(ActionEvent evt) String s1= new SimpleDateFormat(yyyy-MM-dd HH:mm:ss).format(new Date(); labelTime.setText(现在时间是:+s1); ); timer.start();/线程启动 public void init()/设置日期标签函数 int year,month,first_day_num; String log= 星期日, 星期一, 星期二, 星期三, 星期四, 星期五, 星期六; for(int i=0;i7;i+) labeli.setText(logi); for(int i=0;i49;i=i+7) labeli.setForeground(Color.red);/将星期天设置为红色 for(int i=6;i49;i=i+7) labeli.setForeground(Color.red);/将星期六设置为红色 for(int i=1800;i=2100;i+)/将年份的下拉设置为1800-2100年 com1.addItem(+i); for(int i=1;i13;i+)/讲月份下拉设置为12月 com2.addItem(+i); first_day_num=(int)(now.get(Calendar.DAY_OF_WEEK);/获得日期 month=(int)(now.get(Calendar.MONTH);/获得月份 year=(int)(now.get(Calendar.YEAR);/获得年份 com1.setSelectedIndex(year-1800);/将年份设置为当前年份 com2.setSelectedIndex(month);/将月份设置为当前月 Resetday(first_day_num,year,month);/调用Resetday函数 public int use(int year2,int month2)/use函数 int first_day; now.set(year2, month2,1); first_day=(int)(now.get(Calendar.DAY_OF_WEEK); return first_day; public void stateChanged() int year3,month3,week3; year3=Integer.parseInt(com1.getSelectedItem().toString(); month3=Integer.parseInt(com2.getSelectedItem().toString()-1; week3=use(year3,month3); Resetday(week3,year3,month3);/调用函数 public void Resetday(int week_log, int year_log, int month_log) /Resetday函数 int month_day_score; / 存储月份的天数 int count; Lunar lunar;/定义lunar int month_day; String LunarDate=new String49;/农历标签 month_day_score = 0; count = 1; for (int i = 0; i 49; i +) /将农历跟公历一起显示 for(int j=0;j49;j=j+7) if(i!=ji!=j+6) labeli.setForeground(Color.black); for(int j=0;i49;i=i+7) labeli.setForeground(Color.red); for(int j=6;i49;i=i+7) labeli.setForeground(Color.red); Date date = new Date(year_log, month_log + 1, 1); / now MONTH是从0开始的, 对于一月第几天来说,DAY_OF_MONTH第一天就是1. 对于一年第几个月来说,MONTH一月份是0,二月份是1. Calendar cal = Calendar.getInstance(); cal.setTime(date); cal.add(Calendar.MONTH, -1); / 前个月 month_day_score = cal.getActualMaximum(Calendar.DAY_OF_MONTH);/ 最后一天 month_day=month_day_score; for (int i = 7; i 49; i+) / 初始化标签 labeli.setText(); week_log = week_log + 6; / 将星期数加6,使显示正确 month_day_score = month_day_score + week_log; lunar=new aa.Lunar();/调用Lunar类 for(int i=0;imonth_day;i+) LunarDatei=lunar.getLunarDate( year_log, month_log+1, i+1);/农历的实现 for (int i = week_log; i month_day_score; i+, count+) /一些假期 if(month_log=9count=1) labeli.setText(count +国庆 ); labeli.setForeground(Color.red); else if(month_log=0count=1) labeli.setText(count +元旦 ); labeli.setForeground(Color.red); else if(month_log=11count=24) labeli.setText(count +平安夜 ); labeli.setForeground(Color.red); else if(month_log=11count=25) labeli.setText(count +圣诞 ); labeli.setForeground(Color.red); else if(month_log=1count=14) labeli.setText(count +情人节 ); labeli.setForeground(Color.red); else if(month_log=4count=1) labeli.setText(count +劳动节 ); labeli.setForeground(Color.red); else if(LunarDatei-week_log.equals(春节)|LunarDatei-week_log.equals(元宵)|LunarDatei-week_log.equals(端午)|LunarDatei-week_log.equals(中秋) labeli.setText(n+count +LunarDatei-week_log ); labeli.setForeground(Color.red); else labeli.setText(count +LunarDatei-week_log ); public void itemStateChanged(ItemEvent e) stateChanged();/调用函数 public static void main(String args)/主函数 new MainFrame(); 3.2 Lunar类package aa;import java.awt.Color;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;public class Lunar private int year; private int month; private int day; private boolean leap; final static String chineseNumber = 一, 二, 三, 四, 五, 六, 七, 八, 九, 十, 十一, 十二; 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, 0x0ada2, 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, 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, 0x0b27a, 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, 0x15176, 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; /= 传回农历 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) != 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 private static int monthDays(int y, int m) if (lunarInfoy - 1900 (0x10000 m) = 0) return 29; else return 30; /= 传回农历 y年的生肖 final public String animalsYear() final String Animals = new String鼠, 牛, 虎, 兔, 龙, 蛇, 马, 羊, 猴, 鸡, 狗, 猪; return Animals(year - 4) % 12; /= 传入 月日的offset 传回干支, 0=甲子 final private static String cyclicalm(int num) final String Gan = new String甲, 乙, 丙, 丁, 戊, 己, 庚, 辛, 壬, 癸; final String Zhi = new String子, 丑, 寅, 卯, 辰, 巳, 午, 未, 申, 酉, 戌, 亥; return (Gannum % 10 + Zhinum % 12); /= 传入 offset 传回干支, 0=甲子 final public String cyclical() int num = year - 1900 + 36; return (cyclicalm(num); public static String getChinaDayString(int day) String chineseTen = 初, 十, 廿, 卅; int n = day % 10 = 0 ? 9 : day % 10 - 1; if (day 30) return ; if (day = 10) return 初十; else return chineseTenday / 10 + chineseNumbern; /* */* * 传出y年m月d日对应的农历. * yearCyl3:农历年与1864的相差数 ? * monCyl4:从1900年1月31日以来,闰月数 * dayCyl5:与1900年1月31日相差的天数,再加40 ? * param cal * return */ public String getLunarDate(int year_log, int month_log, int day_log) /SuppressWarnings(unused) int yearCyl, monCyl, dayCyl; int leapMonth = 0; String nowadays; Date baseDate = null; Date nowaday=null; try baseDate = chineseDateFormat.parse(1900年1月31日); catch (ParseException e) e.printStackTrace(); /To change body of catch statement use Options | File Templates. nowadays=year_log+年+month_log+月+day_log+日; try nowaday = chineseDateFormat.parse(nowadays); catch (ParseException e) e.printStackTrace(); /To change body of catch statement use Options | File Templates. /求出和1900年1月31日相差的天数 int offset = (int) (nowaday.getTime() - baseDate.getTime() / 86400000L); dayCyl = offset + 40; monCyl = 14; /用offset减去每农历年的天数 / 计算当天是农历第几天 /i最终结果是农历的年份 /offset是当年的第几天 int iYear, daysOfYear = 0; for (iYear = 1900; iYear 10000 offset 0; iYear+) daysOfYear = yearDays(iYear); offset -= daysOfYear; monCyl += 12; if (offset 0) offset += daysOfYear; 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 iMonth = (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 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; if(month)=1)day=1) return 春节; else if(month)=1)day=15) return 元宵; else if(month)=5)day=5) return 端午; else if(month)=8)day=15) return 中秋; else if(day=1) return chineseNumbermonth - 1 + 月; else return getChinaDayString(day); public String toString() if(chineseNumbermonth - 1=一getChinaDayString(day)=初一) return 农历+year + 年; else if(getChinaDayString(day)=初一) return chineseNumbermonth - 1 + 月; else return getChinaDayString(day); /return year + 年 + (leap ? 闰 : ) + chineseNumbermonth - 1 + 月 + getChinaDayString(day); 3.3 national类package aa;import java.awt.Container;import java.awt.Font;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.text.SimpleDateFormat;import java.util.Date;import java.util.TimeZone;import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;public class national public national() ComboBoxFrame frame = new ComboBoxFrame();frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);class ComboBoxFrame extends JFrame public static final int DEFAULT_WIDTH = 430;/设置窗口大小public static final int DEFAULT_HEIGHT = 200;public ComboBoxFrame() setTitle(世界时间);/标题setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);/ add panel to frameComboBoxPanel panel = new ComboBoxPanel();Container contentPane = getContentPane();contentPane.add(panel);Thread t = new Thread(panel);/线程t.start();/线程启动class ComboBoxPanel extends JPanel implements Runnable JLabel label1 = null;/定义各组件JLabel label2 = null;JLabel label3 = null;JLabel label4 = null;JLabel label5 = null;JComboBox combo1 = null;JComboBox combo2 = null;JComboBox combo3 = null;/默认时间,北京、纽约、东京private String timeZone1 = Etc/GMT-8;/北京时间private String timeZone2 = America/New_York;/纽约时间private String timeZone3 = Asia/Tokyo;/东京时间public ComboBoxPanel() label1 = new JLabel();label2 = new JLabel();label3 = new JLabel();label4 = new JLabel(下面的时间默认为北京,纽约,东京的时间,下拉选择其他地方时间);/添加标签label5 = new JLabel(同一个世界,同一个梦想,JLabel.CENTER);label1.setFont(new Font(Dialog, Font.BOLD, 12);/设置字体label2.setFont(new Font(Dialog, Font.BOLD, 12);label3.setFont(new Font(Dialog, Font.BOLD, 12);combo1 = new JComboBox(TimeZone.getAvailableIDs();/下拉组件combo2 = new JComboBox(TimeZone.getAvailableIDs();combo3 = new JComboBox(TimeZone.getAvailableIDs();Clock();add(label4);add(label1);add(combo1);add(label2);add(combo2);add(label3);add(combo3);add(label5);JComboBoxAction combo11Action = new JCo

温馨提示

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

评论

0/150

提交评论