《java课程设计报告—万年历——詹永堂(共21页).doc》由会员分享,可在线阅读,更多相关《java课程设计报告—万年历——詹永堂(共21页).doc(22页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上Java程序设计课程设计报告题 目: 万年历 学 院: 计算机科学与工程学院 专 业: 信息管理与信息系统 学生姓名: 詹永堂 学 号: 指导教师: 汪华登 2013年 6 月 30 日专心-专注-专业目 录目录前言1995年,Java语言的名字从Oak编程了Java。1997年J2SE1.1发布。1998年J2SE1.2发布,标志Java2的诞生。十多年来,Java编程语言及平台成功地运用在网络计算及移动等各个领域。Java的体系结构由Java语言、Java class、Java API、Java虚拟机组成。它具有简单、面向对象、健壮、安全、结构中立、可移植和高效能
2、等众多优点。Java支持多线程编程,Java运行时系统在多线程同步方面具有成熟的解决方案。Java的平台标准有Java ME,Java SE和Java EE。Java发展到今天,它的卓越成就及在业界的地位毋庸置疑。本次课程设计开发平台使用Eclipse。参照JDK帮助。1需求分析1.1需求分析本程序的要求为:(1)能够显示实现1800-2100年的日期,包括公历、农历、星期、二十四节气。(2)能够按照月份格式显示,或按照星期格式显示。(3)能够显示系统时间。(4) 能够设置闹钟。(5)能够查询若干国际大城市(分布在不同时区)的时间。1.2功能设计本程序要构建的万年历程序,其功能有以下几个方面:
3、一、设计程序运行界面,具有显示各种功能的面板模块,并对各功能按钮就行时间监听;二、程序需要显示1800年到2100年的日历,包括公历、农历、时间所对应的星期。要求系统能够从界面上的操作获取公历日期,计算其所对应的星期和相应的农历并显示到界面上;三、程序要求显示系统时间,并能设置闹铃。要求可以自己设置一个时间点,在这一时间点做出相应的响应;四、查询显示若干国际城市不同时区的时间,这里只需要调用Java的系统里就可以解决。五、对时间的更新,日历显示要求关联系统时间,能在进入程序时显示系统时间对应的日历,并能返回当天日历;六、程序界面的美观设计和人性化结构,要求具有良好的人机交互,容易理解界面内容,
4、易操作;七、就现在的水平来说,功能1、2、3、5是可以实现,功能4 有待研究,可能遇到的问题是按钮对时间的监听处理可能难度较大,还有就是在公历转农历中可能比较难获取相应的公历变化日期 。2.概要设计2.1程序设计思路1. 总天数的算法:首先用if语句判断定义年到输入年之间每一年是否为闰年,是闰年,该年的总天数为366,否则,为365。然后判断输入的年是否为定义年,若是,令总天数S=1,否则,用累加法计算出定义年到输入年之间的总天数,再把输入年的一月到要输出的月份之间的天数累加起来,若该月是闰年中的月份并且该月还大于二月,再使总天数加1,否则,不加,既算出从定义年一月一日到输出年的该月一日的总天
5、数。2. 输出月份第一天为星期几的算法:使总天数除以7取余加2得几既为星期几,若是7,则为星期日。3. 算出输出月份第一天为星期几的算法:算出输出月份第一天为星期几后,把该日期以前的位置用空格补上,并总该日起一次输出天数直到月底,该月中的天数加上该月一日为星期几的数字再除以7得0换行,即可完整的输出该月的日历。4.获取系统时间,计算当天农历日期并显示2.2程序运行界面2.3流程图程序初始化获取当前系统时间年份等数据提交年月变更数据 是否输入年份或选择月份开始计算,绘制屏幕结束计算农历3.各模块的功能及程序说明3.1.初始化组件 import java.awt.*;import java.awt
6、.event.*;import javax.swing.*;import javax.swing.table.DefaultTableModel;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.util.GregorianCalendar;import java.util.Locale;import java.util.TimeZone;3.2.初始化数据public class wannianli
7、extends JFrame implements ActionListener, MouseListener private Calendar cld = Calendar.getInstance();/获取一个Calendar类的实例对象private String astr = 星期一, 星期二, 星期三, 星期四, 星期五, 星期六, 星期日 ;private DefaultTableModel dtm = new DefaultTableModel(null, astr);private JTable table = new JTable(dtm);private JScrollPa
8、ne sp = new JScrollPane(table);private JButton bLastYear = new JButton(上一年);private JButton bNextYear = new JButton(下一年);private JButton bLastMonth = new JButton(上月);private JButton bNextMonth = new JButton(下月);private JPanel p1 = new JPanel(); / 设立八个中间容器,装入布局控制日期的按钮模块private JPanel p2 = new JPanel(
9、new GridLayout(3,2);/网格布局private JPanel p3 = new JPanel(new BorderLayout();/边界布局private JPanel p4 = new JPanel(new GridLayout(2,1);private JPanel p5 = new JPanel(new BorderLayout(); private JPanel p6 = new JPanel(new GridLayout(2,2); private JPanel p7 = new JPanel(new GridLayout(2,1); private JPanel
10、 p8 = new JPanel(new BorderLayout(); private JComboBox timeBox = new JComboBox(TimeZone.getAvailableIDs();/对所有支持时区进行迭代,获取所有的id;private JTextField jtfYear = new JTextField(5);/ jtfYeaar年份显示输入框private JTextField jtfMonth = new JTextField(2);/ jtfMouth月份显示输入框private JTextField timeField=new JTextField(
11、);/各城市时间显示框private static JTextArea jta = new JTextArea(10,5);/农历显示区private JScrollPane jsp = new JScrollPane(jta);private JLabel l = new JLabel(花江小精灵:亲!你可以直接输入年月查询.);private JLabel lt = new JLabel();private JLabel ld = new JLabel();private JLabel lu = new JLabel(农历和节气);private JLabel null1=new JLab
12、el();private int lastTime;/private String localTime = null;private String s = null;private SimpleDateFormat dateFormat=new SimpleDateFormat(yyyy年MM月dd日 hh时mm分ss秒);3.3.绘制程序界面public wannianli() super(花江日历 过去仅留追忆,未来刚生憧憬,唯有坚守本心,把握今天 ZYT 詹永堂 );/ 框架命名this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/ 窗
13、口关闭函数this.getContentPane().setLayout(new BorderLayout(9, 10);jta.setLineWrap(true);/ 长度大于分配长度时候则换行jta.setFont(new Font(黑体, Font.BOLD, 16);table.setBackground(Color.white);table.setGridColor(Color.pink);/ 星期之间的网格线是灰色的table.setBackground(Color.white);table.setColumnSelectionAllowed(true);/ 将table中的列设置
14、为可选择table.setSelectionBackground(Color.pink);/ 当选定时背景颜色为黑色table.setSelectionForeground(Color.GREEN);table.setBackground(new Color(184,207, 229);/ 日期显示表格为浅蓝色table.setFont(new Font(黑体, Font.BOLD, 24);/ 日期数字字体格式table.setRowHeight(26);/ 表格的高度table.addMouseListener(this); / 鼠标监听器、lu.setFont(new Font(黑体,
15、Font.BOLD, 22);/农历标签格氏jtfYear.addActionListener(this);/ 可输入年份的文本框/ 为各个按钮添加监听函数bLastYear.addActionListener(this);bNextYear.addActionListener(this);bLastMonth.addActionListener(this);bNextMonth.addActionListener(this);timeBox.addItemListener(new TimeSelectedChangedListener();/ 将按钮添加到Jpane上p1.add(bLast
16、Year);p1.add(jtfYear);/ 年份输入文本框p1.add(bNextYear);p1.add(bLastMonth);p1.add(jtfMonth);p1.add(bNextMonth);p3.add(jsp, BorderLayout.SOUTH);p3.add(lu,BorderLayout.CENTER);p3.add(ld, BorderLayout.NORTH);p4.add(lt);p4.add(l);p5.add(p4, BorderLayout.SOUTH);p5.add(sp, BorderLayout.CENTER);p5.add(p1, BorderL
17、ayout.NORTH);p6.add(timeBox);p6.add(null1);p6.add(timeField); p8.add(p2,BorderLayout.CENTER);p8.add(p7,BorderLayout.SOUTH);this.getContentPane().add(p3, BorderLayout.EAST);this.getContentPane().add(p5, BorderLayout.CENTER);this.getContentPane().add(p6,BorderLayout.SOUTH);this.getContentPane().add(p8
18、,BorderLayout.WEST);String strDate = DateFormat.getDateInstance().format(new Date().split(-);/ 获取日期 cld.set(Integer.parseInt(strDate0), Integer.parseInt(strDate1) - 1,0);showCalendar(Integer.parseInt(strDate0),Integer.parseInt(strDate1), cld);jtfMonth.setEditable(false);/ 设置月份文本框为不可编辑jtfYear.setText
19、(strDate0);jtfMonth.setText(strDate1);this.showTextArea(strDate2);ld.setFont(new Font(新宋体, Font.BOLD, 24);new Timer(lt).start();new TimeThread().start();this.setBounds(200, 200, 700, 350);this.setResizable(false);this.setVisible(true);3.4计算各个月的天数 运用if语句判断各个月的最大天数 public int getDaysOfMonth(int Year,
20、int Month) /计算各月的天数if(Month=1|Month=3|Month=5|Month=7|Month=8|Month=10|Month=12)return 31;if(Month=4|Month=6|Month=9|Month=11)return 30;if(Year%4=0&Year%100!=0|Year%400=0)/闰年return 29;else return 28;3.5年份输入控制这个监听事件用于监听程序界面的操作,获取年月的相应数据,用if语句对月份操作进行控制,如当前年月为1992年1月时,点击“上一月”,年份减1,月份为12 ,即为1991年12月;当前月
21、份为12时,点击“下一月”,年份加1,月份为1,如图public void actionPerformed(ActionEvent e)/从界面上获取年月数据 if(e.getSource() = jtfYear | e.getSource() = bLastYear | e.getSource() = bNextYear | e.getSource() = bLastMonth | e.getSource() = bNextMonth) int m, y; try/控制输入的年份正确,异常控制 if (jtfYear.getText().length() != 4) throw new Nu
22、mberFormatException(); y = Integer.parseInt(jtfYear.getText(); m = Integer.parseInt(jtfMonth.getText(); catch (NumberFormatException ex) JOptionPane.showMessageDialog(this, 请输入4位0-9的数字!, 年份有误, JOptionPane.ERROR_MESSAGE); return; ld.setText(没有选择日期); for (int i = 0; i 0x8; i = 1) if (lunarInfoy - 1900
23、 & 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) (lunarIn
24、foy - 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 static String AnimalsYear(int y) return Animals(y - 4) % 12; /传入 月日的offset 传回干支,0=甲子 final private static String cyclicalm(
25、int num) return (Gannum % 10 + Zhinum % 12); / 传入 offset 传回干支, 0=甲子 final public static String cyclical(int y) int num = y - 1900 + 36; return (cyclicalm(num); / 传出农历.year0 .month1 .day2 .yearCyl3 .monCyl4 .dayCyl5 .isLeap6 final private long Lunar(int y, int m) long nongDate = new long7; int i = 0, temp = 0, leap = 0; Date baseDate = new GregorianCalendar(1900 + 1900, 1, 31).getTime(); Date objDate = new GregorianCalendar(y + 1900, m, 1).getTime(); long offset = (objDate.getTime() - baseDate.getTime() / L; if (y 2000) offset +=
限制150内