收藏 分享(赏)

java课程设计报告74717.doc

上传人:精品资料 文档编号:8667965 上传时间:2019-07-07 格式:DOC 页数:20 大小:230KB
下载 相关 举报
java课程设计报告74717.doc_第1页
第1页 / 共20页
java课程设计报告74717.doc_第2页
第2页 / 共20页
java课程设计报告74717.doc_第3页
第3页 / 共20页
java课程设计报告74717.doc_第4页
第4页 / 共20页
java课程设计报告74717.doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述

1、Java 程序设计课程设计报告题 目:万年历 学 院:数学与统计 专 业:信计 学生姓名:梦超然 学 号:101428717522 指导教师:李志新 2017 年 7 月 9 日11 需求分析1.1 需求分析本程序的要求为:(1)能够显示实现 1800-2100 年的日期,包括公历、农历、星期、二十四节气。(2)能够按照月份格式显示,或按照星期格式显示。(3)能够显示系统时间。(4) 能够设置闹钟。(5)能够查询若干国际大城市(分布在不同时区)的时间。1.2 功能设计本程序要构建的万年历程序,其功能有以下几个方面:一、设计程序运行界面,具有显示各种功能的面板模块,并对各功能按钮就行时间监听;二

2、、程序需要显示 1800 年到 2100 年的日历,包括公历、农历、时间所对应的星期。要求系统能够从界面上的操作获取公历日期,计算其所对应的星期和相应的农历并显示到界面上;三、程序要求显示系统时间,并能设置闹铃。要求可以自己设置一个时间点,在这一时间点做出相应的响应;四、查询显示若干国际城市不同时区的时间,这里只需要调用 Java 的系统里就可以解决。五、对时间的更新,日历显示要求关联系统时间,能在进入程序时显示系统时间对应的日历,并能返回当天日历;六、程序界面的美观设计和人性化结构,要求具有良好的人机交互,容易理解界面内容,易操作;七、就现在的水平来说,功能 1、2、3、5 是可以实现,功能

3、 4 有待研究,可能遇到的问题是按钮对时间的监听处理可能难度较大,还有就是在公历转农历中可能比较难获取相应的公历变化日期 。22.概要设计2.1 程序设计思路1. 总天数的算法:首先用 if 语句判断定义年到输入年之间每一年是否为闰年,是闰年,该年的总天数为 366,否则,为 365。然后判断输入的年是否为定义年,若是,令总天数 S=1,否则,用累加法计算出定义年到输入年之间的总天数,再把输入年的一月到要输出的月份之间的天数累加起来,若该月是闰年中的月份并且该月还大于二月,再使总天数加 1,否则,不加,既算出从定义年一月一日到输出年的该月一日的总天数。2. 输出月份第一天为星期几的算法:使总天

4、数除以 7 取余加 2 得几既为星期几,若是 7,则为星期日。3. 算出输出月份第一天为星期几的算法:算出输出月份第一天为星期几后,把该日期以前的位置用空格补上,并总该日起一次输出天数直到月底,该月中的天数加上该月一日为星期几的数字再除以 7 得 0 换行,即可完整的输出该月的日历。4.获取系统时间,计算当天农历日期并显示2.2 程序运行界面2.3 流程图程序初始化获取当前系统时间年份等数据提交年月变更数据 是否输入年份或选择月份开始计算,绘制屏幕结束33.各模块的功能及程序说明3.1.初始化组件import java.awt.*;import java.awt.event.*;import

5、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 extends JFrame/窗

6、体类 implements ActionListener/事件处理接口, MouseListener private Calendar cld = Calendar.getInstance();/获取一个Calendar类的实例对象,Calendar 类用于获 取某个时间或日期private String astr = “星期一“, “星期二“, “星期三“, “星期四“, “星期五“, “星期六“, “星期日“ ;private DefaultTableModel dtm = new DefaultTableModel(null, astr); /创建了一个表格模型private JTabl

7、e table = new JTable(dtm); / JTable 用来显示和编辑常规 二维单元表private JScrollPane sp = new JScrollPane(table);/ JScrollPane类可提供轻量级组件的 scrollable 视图。JScrollPane 管理视口、可 选的垂直和水平滚动条以及可选的行和列标题视口。private JButton bLastYear = new JButton(“上一年“);/建立一个“上一年“ 的按钮private JButton bNextYear = new JButton(“下一年“);private JButt

8、on bLastMonth = new JButton(“上月“);计算农历4private JButton bNextMonth = new JButton(“下月“);/JPanel 是 Java图形用户界面(GUI)工具包swing中的面板容器类,包含在javax.swing 包中,是一种 轻量级容器,可以加入到JFrame窗体中。 JPanel默认的布局管理器是FlowLayout,其自身可以嵌套组合,在不同子容器中可包含其他组件(component),如JButton、JTextArea、JTextField 等private JPanel p1 = new JPanel(); /

9、设立八个中 间容器,装入布局控制日期的按钮模块private JPanel p2 = new JPanel(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();/边界布局管理器,构造一个组件之间没有间距(默认间距 为0像素)的新边框布局。private

10、JPanel p6 = new JPanel(new GridLayout(2,2);private JPanel p7 = new JPanel(new GridLayout(2,1);private JPanel p8 = new JPanel(new BorderLayout();private JComboBox timeBox = new JComboBox(TimeZone.getAvailableIDs();/对所有支持时区进行迭代,获取所有的 id; JComboBox组件可以 实现在组 合框内编辑。/JTextField(int columns),构造一个具有指定列数的新的空

11、 TextField。JTextField 是一个轻量级组件,它允许编辑单行文本。private JTextField jtfYear = new JTextField(5);/ jtfYeaar年份显示输入框private JTextField jtfMonth = new JTextField(2);/ jtfMouth月份显示输入框private JTextField timeField=new JTextField();/各城市时间显示框private static JTextArea jta = new JTextArea(10,5);/农历显示区private JScrollPan

12、e jsp = new JScrollPane(jta);/ JScrollPane(Component view);建立一个新的JScrollPane对象,当组件内容大于显示区域时会自动产生滚动轴。private JLabel l = new JLabel(“梦落痴狂:亲!你可以直接输入年月查询.“ );/JLabel(String text) 创建具有指定文本的 JLabel 实例。private JLabel lt = new JLabel();private JLabel ld = new JLabel();/ JLabel() 创建无图像并且其标题为空字符串的 JLabel。priv

13、ate JLabel lu = new JLabel(“农历和节气 “);private JLabel null1=new JLabel();private int lastTime;/private String localTime = null;private String s = null;private SimpleDateFormat dateFormat=new SimpleDateFormat(“yyyy年MM 月dd日 hh时mm 分ss 秒“);/ SimpleDateFormat 允许以为日期-时间格式化选择任何用户指定的方式启动。例:5SimpleDateFormat m

14、yFmt=new SimpleDateFormat(“yyyy年MM月dd日 HH时mm分ss秒“);SimpleDateFormat myFmt1=new SimpleDateFormat(“yy/MM/dd HH:mm“); SimpleDateFormat myFmt2=new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss“);得到:2004年12月16日 17时24分27秒04/12/16 17:242004-12-16 17:24:273.3.绘制程序界面public wannianli() super(“万年历 一生痴狂 一世繁华 BY 梦落痴狂“);

15、/ 框架命名this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/ 窗口关闭函数this.getContentPane().setLayout(new BorderLayout(9, 10);/设置用户界面上的屏幕组件的格式布局,是java 图形界面 编程的常用方法jta.setLineWrap(true);/ 长度大于分配长 度时候则换行jta.setFont(new Font(“黑体“ , Font.BOLD, 16);table.setBackground(Color.white);table.setGridColor(Color.pi

16、nk);/ 星期之间的网格线是灰色的table.setColumnSelectionAllowed(true);/ 将table中的列设置为可选择table.setSelectionBackground(Color.pink);/ 当选定某一天时背景颜色为黑色table.setSelectionForeground(Color.GREEN);table.setBackground(new Color(184,207, 229);/ 日期显示表格为浅蓝色table.setFont(new Font(“黑体“ , Font.BOLD, 24);/ 日期数字字体格式table.setRowHeigh

17、t(26);/ 表格的高度table.addMouseListener(this); / 鼠标监听器、lu.setFont(new Font(“黑体“, Font.BOLD, 22);/农历标签格氏jtfYear.addActionListener(this);/ 可输入年份的文本框/ 为各个按钮添加监听函数bLastYear.addActionListener(this);bNextYear.addActionListener(this);bLastMonth.addActionListener(this);bNextMonth.addActionListener(this);timeBox

18、.addItemListener(new TimeSelectedChangedListener();/根据运行结果,可以设置类实现ActionListener接口和ItemListener接口以进行动作事件处理和选项变化事件处理。/ 将按钮添加到Jpane上p1.add(bLastYear);6p1.add(jtfYear);/ 年份输入文本框p1.add(bNextYear);p1.add(bLastMonth);p1.add(jtfMonth);p1.add(bNextMonth);p3.add(jsp, BorderLayout.SOUTH);p3.add(lu,BorderLayou

19、t.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, BorderLayout.NORTH);p6.add(timeBox);p6.add(null1);p6.add(timeField);p8.add(p2,BorderLayout.CENTER);p8.add(p7,BorderLayout.SOUTH);this.getContentPane().add(p3, Borde

20、rLayout.EAST);this.getContentPane().add(p5, BorderLayout.CENTER);this.getContentPane().add(p6,BorderLayout.SOUTH);this.getContentPane().add(p8,BorderLayout.WEST);String strDate = DateFormat.getDateInstance().format(new Date().split(“-“);/ 获取日期“2017-6-1“-“2017“ “6“ “1“cld.set(Integer.parseInt(strDate

21、0), Integer.parseInt(strDate1),0);/paresInt强转成int类型,Integer就是整数型,/月份从0开始,存到数组里0 1 2 showCalendar(Integer.parseInt(strDate0),Integer.parseInt(strDate1), cld);jtfMonth.setEditable(false);/ 设置月份文本框为不可编辑jtfYear.setText(strDate0);jtfMonth.setText(strDate1);this.showTextArea(strDate2);ld.setFont(new Font(

22、“新宋体“, Font.BOLD, 24);new Timer(lt).start();new TimeThread().start();this.setBounds(200, 200, 700, 350); /显示窗口在屏幕的位置以及窗口自身的大小this.setResizable(false); 7/ resizeable值为true时,表示在生成的窗体可以自由改变大小;this.setVisible(true); /窗体可见3.4 计算各个月的天数运用if语句判断各个月的最大天数public int getDaysOfMonth(int Year, int Month) /计算各月的天数

23、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=0else return 28;3.5 年份输入控制这个监听事件用于监听程序界面的操作,获取年月的相应数据,用if语句对月份操作进行控制,如当前年月为2017年1月时,点击“上一月”,年份减1,月份为12 ,即为2016年12月;当前月份为12时,点击“下一月”,年份加1,月份为1 ,如图public void actionPerformed(

24、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)8throw new NumberFormatException();/数字格式错误y = Integer.parseInt(jtfYear.g

25、etText();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 return (sum + leapDays(y);/ 传回农历 y年闰月的天数final privat

26、e static int leapDays(int y) if (leapMonth(y) != 0) if (lunarInfoy - 1900 elsereturn 29; elsereturn 0;/ 传回农历 y年闰哪个月 1-12 , 没闰传回 0final private static int leapMonth(int y) return (int) (lunarInfoy - 1900 /传回农历 y年m月的总天数final private static int monthDays(int y, int m) if (lunarInfoy - 1900 elsereturn 3

27、0;/ 传回农历 y年的生肖final public static String AnimalsYear(int y) return Animals(y - 4) % 12;/传入 月日的offset 传回干支,0=甲子final private static String cyclicalm(int num) 13return (Gannum % 10 + Zhinum % 12);/ 传入 offset 传回干支, 0=甲子final public static String cyclical(int y) int num = y - 1900 + 36;return (cyclicalm

28、(num);/ 传出农历.year0 .month1 .day2 .yearCyl3 .monCyl4 .dayCyl5 .isLeap6final 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

29、offset = (objDate.getTime() - baseDate.getTime() / 86400000L;if (y 2000)offset += year20m - 1;if (y = 2000)offset += year2000m - 1;nongDate5 = offset + 40;nongDate4 = 14;for (i = 1900; i 0; i+) temp = lYearDays(i);offset -= temp;nongDate4 += 12;if (offset 0; i+) / 闰月if (leap 0 nongDate6 = 1;14temp =

30、 leapDays(int) nongDate0); else temp = monthDays(int) nongDate0, i);/ 解除闰月if (nongDate6 = 1 offset -= temp;if (nongDate6 = 0)nongDate4+;if (offset = 0 else nongDate6 = 1;-i;-nongDate4;if (offset 0; i+) temp = lYearDays(i);15offset -= temp;nongDate4 += 12;if (offset 0; i+) / 闰月if (leap 0 nongDate6 =

31、1;temp = leapDays(int) nongDate0); else temp = monthDays(int) nongDate0, i);/ 解除闰月if (nongDate6 = 1 offset -= temp;if (nongDate6 = 0)nongDate4+;if (offset = 0 else nongDate6 = 1;-i;-nongDate4;if (offset 0) offset += temp;-i;-nongDate4;16nongDate1 = i;nongDate2 = offset + 1;return nongDate;public fin

32、al static String getChinaDate(int day) String a = “;if (day = 10)return “初十“;if (day = 20)return “二十“;if (day = 30)return “三十“;int two = (int) (day) / 10);if (two = 0)a = “初“;if (two = 1)a = “十“;if (two = 2)a = “廿“;if (two = 3)a = “三“;int one = (int) (day % 10);switch (one) case 1:a += “一“ ;break;ca

33、se 2:a += “二“ ;break;case 3:a += “三“ ;break;case 4:a += “四“ ;break;case 5:a += “五“ ;break;case 6:a += “六“ ;break;case 7:17a += “七“ ;break;case 8:a += “八“ ;break;case 9:a += “九“ ;break;return a;public static String today() Calendar today = Calendar.getInstance(Locale.SIMPLIFIED_CHINESE);int year = to

34、day.get(Calendar.YEAR);int month = today.get(Calendar.MONTH) + 1;int date = today.get(Calendar.DATE);long l = calElement(year, month, date);StringBuffer sToday = new StringBuffer();try sToday.append(sdf.format(today.getTime();sToday.append(“ n“);sToday.append(“ n“);sToday.append(“ n“);sToday.append(

35、“ 农历“);sToday.append(cyclical(year);sToday.append();sToday.append(AnimalsYear(year);sToday.append(“)年“ );sToday.append(“ n“);sToday.append(“ “);sToday.append(nStr1(int) l1);sToday.append(“月“);sToday.append(getChinaDate(int) (l2);return sToday.toString(); finally sToday = null;private static SimpleDa

36、teFormat sdf = new SimpleDateFormat(“yyyy年M 月d日 EEEEE“);public void mouseEntered(MouseEvent e) 18public void mouseExited(MouseEvent e) public void mousePressed(MouseEvent e) public void mouseReleased(MouseEvent e) 4测试分析图 4-1 开始运行界面19图 4-2 更改日期日历显示界面以及国际时间查询6课程设计体会通过这次课程设计,我明白了编写程序,不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力。还要熟悉常用的编程技巧和编程思想,不能只关心程序的运行结果,更要注重程序代码的结构,编程者更要有严谨地态度。本次设计过程中大量地查阅网络文章,对一些关键知识点逐个地了解并解决相关问题。所以网络这个强大的工具,确实是我们学习之中可以借助的一个很好的帮手。网络是我们学习的最好的老师之一。有问题,百度一下,是一个很好的习惯。更重要的是,认识到了很多自身的不足,需要在后续的学习中不断提高自己,查漏补缺、更进一步!

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报