西安科技大学程序设计综合实训课程设计报告题目:万年历班级:学号:姓名:2103年12月目录1绪论 (1)1.1选题目的及意义 (1)1.2 系统概述 (1)1.3 人员组成及分工 (1)2 需求分析 (1)3 总体设计 (1)4 详细设计 (1)5 系统实现 (2)5.1 开发环境 (3)5.2 关键技术 (3)6.运行结果 (6)7.软件测试 (7)8.总结 (7)9 参考文献 (8)1.绪论1.1选题目的及意义选题目的:本次课程设计为课本后设计题目任选一题进行设计。
思考一段时间后,我们组决定做一个万年历的设计。
主要考虑到以前时间少课程内容多,JAVA课程基础内容掌握并不是很抓实,而对于设计一个万年历程序,由于其功能简单设计也相对较易,对于我们组每个人的学习情况比较合适,并且通过设计这样的一个日历小组件,也能使自己对JAVA 的一些基础知识掌握的更加牢固。
1.2 系统概述随着电子技术的不断发展,人们的不断创新,万年历已经不再局限于书本形式,而是以电脑软件或者电子产品的形式出现。
让其更加便捷。
在学习了JAVA课程后,将以JAVA 形式编译出一个简易的万年历。
1.3 人员组成及分工付磊:负责搜集查找资料王杜超:调试程序两人共同负责程序的编写与修改2.需求分析本程序的要求为:1.使用图形用户界面;2.本程序能够实现日期与星期的查询。
3.可以添加或者删除日志3.总体设计(1)可以通过图形界面显示日历。
(2)能以月历形式显示日期与星期。
(3)支持用户自己输入年份,可以通过上一年,下一年等按钮来选择年份和月份。
(4)可以添加或者删除并且点击对应日期显示日志。
4.详细设计1. 总天数的算法:首先用if语句判断定义年到输入年之间每一年是否为闰年,是闰年,该年的总天数为366,否则,为365。
然后判断输入的年是否为定义年,若是,令总天数S=1,否则,用累加法计算出定义年到输入年之间的总天数,再把输入年的一月到要输出的月份之间的天数累加起来,若该月是闰年中的月份并且该月还大于二月,再使总天数加1,否则,不加,既算出从定义年一月一日到输出年的该月一日的总天数。
2. 输出月份第一天为星期几的算法:使总天数除以7取余得几既为星期几,若是0,则为星期日。
3. 算出输出月份第一天为星期几的算法:算出输出月份第一天为星期几后,把该日期以前的位置用空格补上,并总该日起一次输出天数直到月底,该月中的天数加上该月一日为星期几的数字再除以7得0换行,即可完整的输出该月的日历。
4. 查询年份必须为四位有效数字,否则不予显示。
5.显示系统时间。
6.流程图流程图5.系统实现5.1 开发环境myeclipse-8.5.0-win325.2 关键技术(1)界面的绘制与显示public class wannianli extends JFrame implements ActionListener, MouseListener{private Calendar cld = Calendar.getInstance();private String [] astr = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"};private DefaultTableModel dtm = new DefaultTableModel(null,astr);private JTable table = new JTable(dtm); //装日期的表格private JScrollPane 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 JTextField jtfYear = new JTextField(5);//jtfYear年份显示和输入文本框private JTextField jtfMonth = new JTextField(2);//jtfMonth月份显示文本框private JPanel p1 = new JPanel(); //装入控制日期按钮的模块private JPanel p2 = new JPanel();private JPanel p3 = new JPanel(new BorderLayout());private JPanel p4 = new JPanel(new GridLayout(2,1));private JPanel p5 = new JPanel(new BorderLayout());private JButton bAdd = new JButton("保存日志");private JButton bDel = new JButton("删除日志");背景颜色,字体的显示table.setGridColor(Color.GRAY); //星期之间的网格线是灰色的table.setColumnSelectionAllowed(true);table.setSelectionBackground(Color.BLACK);//当选定某一天时这一天背景黑色table.setSelectionForeground(Color.GREEN);//选定的日期字体是绿色的table.setBackground(new Color(184,207,229));//日期显示表格颜色浅蓝色table.setFont(new Font("黑体",Font.BOLD,24));//日期数字字体格式table.setRowHeight(30);//表格的高度table.addMouseListener(this); //鼠标监听器(2)根据月份判断每个月的天数以及判断是否为闰年判断2月的天数public int getDaysOfMonth(int year, 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)日志的添加与删除if(e.getSource() == bDel){int r = table.getSelectedRow();int c = table.getSelectedColumn();File filedel = new File(ld.getText() + ".txt");if(filedel.exists()){if(filedel.delete()){jta.setText("日志删除成功");}else{jta.setText("日志删除失败");}}else{jta.setText("没有找到日志文件");}}}(4)判断年份输入是否正确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 NumberFormatException();}y = Integer.parseInt(jtfYear.getText());m = Integer.parseInt(jtfMonth.getText());}catch (NumberFormatException ex){JOptionPane.showMessageDialog(this, "请输入4位0-9的数字!", "年份有误", JOptionPane.ERROR_MESSAGE);return;}(5)显示系统时间lass Timer extends Thread//显示系统时间{private JLabel lt;private SimpleDateFormat fy= new SimpleDateFormat("yyyy.MM.dd G 'at' HH:mm:ss z");private SimpleDateFormat fn= new SimpleDateFormat("yyyy.MM.dd G 'at' HH mm ss z");private boolean b = true;public Timer(JLabel lt){this.lt = lt;}public void run(){while (true){try{if (b){lt.setText(fy.format(new Date())); }else{lt.setText(fn.format(new Date())); }b = !b;this.sleep(500);}catch (InterruptedException ex){ex.printStackTrace();}}6.运行结果7.软件测试年份输入错误显示闰年2月份演示以及日志保存8.总结对于本程序的设计,首先考虑其功能有哪些,需要显示什么,如何进行窗体构建布局,需要用哪些知识点,如相关的类和对象等。