1、 淮北师范大学 简单日历的开发与实现学 院 计算机科学与技术 专 业 11 计算机科学与技术(非师范)学 生 姓 名 学 号 指导教师姓名 年 月 日i简单日历的开发与实现作 者: 指导教师:摘 要:目前,日历的应用非常广泛,无论是工人、农民、商人、学生还是官员,都离不开日历。通过使用日历,人们可以更好地规划未来的工作和学习等的时间安排,并且可以方便查看日期,不要自己来记忆或者记不清日期,日历的应用给人们的运算带来了极大的方便。这篇文章主要介绍用软件的方法实现简单日历的实现,包括:日历的概述,日历的开发原理和主要实现的功能,子模块的设计和实现技术。本系统需要实现以下功能:能够显示实现 1950
2、-2100 年的日期,包括公历、星期。能够显示系统时间。能够设置闹钟。该日历的实现是通过 Java 来编写的。Java 的前身是 Oak,它一开始只是被应用于消费性电子产品中。后来它的开发者们发现它还可以被用于更大范围的 Internet 上。1995 年,Java 语言的名字从 Oak 编程了 Java。1997 年 J2SE1.1 发布。1998 年J2SE1.2 发布,标志 Java2 的诞生。十多年来,Java 编程语言及平台成功地运用在网络计算及移动等各个领域。Java 的体系结构由 Java 语言、Java class、Java API、Java 虚拟机组成。它具有简单、面向对象、
3、健壮、安全、结构中立、可移植和高效能等众多优点。Java 支持多线程编程,Java 运行时系统在多线程同步方面具有成熟的解决方案。Java 的平台标准有 Java ME,Java SE 和 Java EE。Java 发展到今天,它的卓越成就及在业界的地位毋庸置疑。目前在众多的支持 Java 的开发工具中主要的 7有 Java Development Kit,NetBeans,Jcreator,JBuilder,JDeveloper 和 Eclipse等。其中 Java Development Kit 简称 JDK 是大多开发工具的基础。以上的每种开发工具都有优缺点,对于开发者来说,重要的是要根
4、据自己的开发规模、开发内容和软硬件环境等因素来选择一种合适的开发工具。关键词:日历;系统时间;计算方法ii目 录引言41 简单日历系统概述.4 1.1 设计简单日历的背景42 系统需要4 2.1 设计分析4 2.1.1 需求分析4 2.2 开发环境42.2.1 运行环境42.2.2 开发工具42.2.3 关于 Ecilpes43 系统设计53.1 功能说明53.1.1 系统功能分析53.2 系统大概53.2.1 设计思路53.2.2 日历运算流程图64 系统的实现 .64.1 窗口的设计64.1.1 设计步骤64.1.2 部分操作截图94.2 程序核心代码.11iii4.2.1 初始化组件11
5、4.2.2 初始化数据124.2.3 showCalendar 显示日历函数.124.2.4 mouseClicked 函数.134.2.5 Timer 显示时间函数.135 系统运行与测试.14 5.1 运行界面.145.2 测试.155.2.1 测试研究与选择.155.2.2 测试环境.155.3 程序代码.15 总结23参考文献234引言本设计主要是为了让人们更好地使用日历,可以方便的查看日期,并且可以设置日志记录或闹钟,本设计主要在每月日期的显示,以及系统时间的显示设计上,还可以在页面上输入要查找的年份并且显示。1 简单日历概述1.1 设计简单日历的背景人们在日常学习、工作和生活过程中
6、,日历的作用是不容置疑的,不仅可以让我们用来查看日期和是星期几了,还可以在有事的某一天添加日志或闹钟来提醒自己,让我们忘掉重要事的可能大大降低。2 系统需求2.1 设计分析2.1.1 需求分析本软件主要用于计算机 Windows XP 以上的用户使用,这次课程设计一般是实现简单日历的功能。需要程序实现:日期的显示功能;还要实现日期与星期的查询并跳转等功能。另外还要实现添加日志或闹钟的功能。可以在设定的那一天显示提醒。2.2 开发环境2.2.1 运行环境系统是在 eclipse 环境下开发的,在 Windows98/Windows2000/Windows NT/Windows XP 平台下运行均
7、可。2.2.2 开发工具Java 语言2.2.3 关于 eclipseVisualEclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Kit,JDK) 。虽然大多数用户很乐于将 Eclipse 当作 Java 集成开发环境(IDE)来使用,但 Eclipse 的目标却不仅限于此。 Eclipse 还包括插件开发环境( Plug-in Development Environment,PDE) ,这个组
8、件主要针对希望扩展 Eclipse 的软件开发人员,因为它允许他们构建与 Eclipse 环境无缝集成的工具。由于 Eclipse 中的每样东西都是插件,对于给 Eclipse 提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。5这种平等和一致性并不仅限于 Java 开发工具。尽管 Eclipse 是使用 Java 语言开发的,但它的用途并不限于 Java 语言;例如,支持诸如 C/C+、COBOL、PHP 等编程语言的插件已经可用,或预计将会推出。Eclipse 框架还可用来作为与软件开发无关的其他应用程序类型的基础,比如内容管理系统。基于 Ecli
9、pse 的应用程序的一个突出例子是 IBM Rational Software Architect,它构成了 IBM Java 开发工具系列的基础。Eclipse 是著名的跨平台的自由 集成开发环境(IDE ) 。最初主要用来 Java 语言开发,但是目前亦有人通过插件使其作为其他计算机语言比如 C+和 Python 的开发工具。Eclipse 的本身只是一个框架平台,但是众多插件的支持使得 Eclipse 拥有其他功能相对固定的 IDE 软件很难具有的灵活性。许多软件开发商以 Eclipse 为框架开发自己的IDE。Eclipse 最初由 OTI 和 IBM 两家公司的 IDE 产品开发组创
10、建,起始于 1999 年 4 月。IBM 提供了最初的 Eclipse 代码基础,包括 Platform、JDT 和 PDE。目前由 IBM 牵头,围绕着 Eclipse 项目已经发展成为了一个庞大的 Eclipse 联盟,有 150 多家软件公司参与到Eclipse 项目中,其中包括 Borland、Rational Software、 Red Hat 及 Sybase 等。Eclipse 是一个开放源码项目,它其实是 Visual Age for Java 的替代品,其界面跟先前的 Visual Age for Java 差不多,但由于其开放源码,任何人都可以免费得到,并可以在此基础上开发
11、各自的插件,因此越来越受人们关注。近期还有包括 Oracle 在内的许多大公司也纷纷加入了该项目,并宣称 Eclipse 将来能成为可进行任何语言开发的 IDE 集成者,使用者只需下载各种语言的插件即可。3 系统设计3.1 功能说明3.1.1 系统功能本系统需要实现以下功能:日期和星期的显示,年份的查找(既可以由上下键来实现上一年和下一年查找的操作) ,月份的查找(既可以由上下键来实现上一月和下一月查找的操作) ,日志的创建和删除功能。3.2 系统大概3.2.1 设计思路1. 总天数的算法:首先用 if 语句判断定义年到输入年之间每一年是否为闰年,是闰年,该年的总天数为 366,否则,为 36
12、5。然后判断输入的年是否为定义年,若是,令总天数 S=1,否则,用累加法计算出定义年到输入年之间的总天数,再把输入年的一月到要输出的月份之间的天数累加起来,若该月是闰年中的月份并且该月还大于二月,再使总天数加 1,否则,不加,既算出从定义年一月一日到输出年的该月一日的总天数。2. 输出月份第一天为星期几的算法:使总天数除以 7 取余加 2 得几既为星期几,若是 7,则为星期日。63. 算出输出月份第一天为星期几的算法:算出输出月份第一天为星期几后,把该日期以前的位置用空格补上,并总该日起一次输出天数直到月底,该月中的天数加上该月一日为星期几的数字再除以 7 得 0 换行,即可完整的输出该月的日
13、历。3.2.2 日历运算流程图图 3-1 日历运算流程图4 系统的实现4.1 窗口的设计4.1.1 设计步骤打开 Eclipse,在文件中点击新建,在弹出框内选择 project,选择 Java Project,点击 Next,如图 4-1 所示。7图 4-1 新建 Java Project将弹出 New Java Project 对话框,设置 Project Name 为 aa,点击完成,如图 4-2所示。8图 4-2在新建中打开,选择 class 后,再出现的对话框中设置 Name 为 wannianli 如图 4-3所示。9图 4-3 4.1.2 部分操作截图日历显示界面:10日历日期查
14、找界面:添加日志界面114.2 程序核心代码4.2.1 初始化组件import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileInputStrea
15、m;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import javax.swing.JButto
16、n;import javax.swing.JDialog;import javax.swing.JFrame;import javax.swing.JLabel;12import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.JTextArea;import javax.swing.JTextField;import javax.swing.table.DefaultTableModel;4
17、.2.2 初始化数据public class wannianli extends JFrame implements ActionListener, MouseListenerprivate Calendar cld = Calendar.getInstance();private String astr = “星期一“, “星期二“, “星期三“, “星期四“, “星期五“, “星期六“, “星期日“;private DefaultTableModel dtm = new DefaultTableModel(null,astr);private JTable table = new JTab
18、le(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);/
19、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 Bo
20、rderLayout();private JButton bAdd = new JButton(“保存日志“);private JButton bDel = new JButton(“删除日志“);private JTextArea jta = new JTextArea(); /jta-JTextAreaprivate JScrollPane jsp = new JScrollPane(jta);private JLabel l = new JLabel(“年份文本框中可直接键入要查找的年份,以提高查询效率“);private JLabel lt = new JLabel();private
21、 JLabel ld = new JLabel();private int lastTime;134.2.3 showCalendar 函数(显示日历)public void showCalendar(int localYear, int localMonth, Calendar cld)int Days = getDaysOfMonth(localYear, localMonth) + cld.get(Calendar.DAY_OF_WEEK) - 2;Object ai = new Object7;lastTime = 0;for (int i = cld.get(Calendar.DAY
22、_OF_WEEK)-1; i = Days; i+)aii%7 = String.valueOf(i-(cld.get(Calendar.DAY_OF_WEEK)-2);if (i%7 = 6)dtm.addRow(ai);ai = new Object7;lastTime+;dtm.addRow(ai);4.2.4 mouseClicked 函数(鼠标点击)public void mouseClicked(MouseEvent e)jta.setText(null);int r = table.getSelectedRow();int c = table.getSelectedColumn(
23、);if (table.getValueAt(r,c) = null) ld.setText(“没有选择日期“) else this.showTextArea(table.getValueAt(r,c); public void mousePressed(MouseEvent e) public void mouseReleased(MouseEvent e) public void mouseEntered(MouseEvent e) public void mouseExited(MouseEvent e) 4.2.5 显示时间函数class Timer extends Thread/显示
24、系统时间private JLabel lt;14private 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)tryif (b) lt.setText(fy.
25、format(new Date();else lt.setText(fn.format(new Date(); b = !b;this.sleep(500);catch (InterruptedException ex)ex.printStackTrace();155 系统运行5.1 运行界面5.2 测试5.2.1 测试研究与选择测试过程中要判断是否成功,要分析程序界面的变化和计算数据的结果是否正确以及各功能键是否能正常实用。5.2.2 测试环境测试系统:Windows98/Windows2000/Windows NT/Windows XP测试工具:Eclipse5.3 程序代码import
26、java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileInputStream;16import java.io.FileNotFoundException
27、;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import javax.swing.JButton;import javax.swing.JDialog;import ja
28、vax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.JTextArea;import javax.swing.JTextField;import javax.swing.table.DefaultTableModel;public class wannianli extends JFrame imp
29、lements ActionListener, MouseListenerprivate 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(t
30、able);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);private JTextField jtfMonth = new JTextField(2);private JPa
31、nel 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(“删除日志“);private
32、 JTextArea jta = new JTextArea(); 17private JScrollPane jsp = new JScrollPane(jta);private JLabel l = new JLabel(“年份文本框中可直接键入要查找的年份,以提高查询效率“);private JLabel lt = new JLabel();private JLabel ld = new JLabel();private int lastTime;public wannianli()super(“简单日历“); this.setDefaultCloseOperation(JFrame.E
33、XIT_ON_CLOSE);this.getContentPane().setLayout(new BorderLayout(10, 0);jta.setLineWrap(true);table.setGridColor(Color.GRAY); table.setColumnSelectionAllowed(true);table.setSelectionBackground(Color.BLACK);table.setSelectionForeground(Color.GREEN);table.setBackground(new Color(184,207,229);table.setFo
34、nt(new Font(“黑体“,Font.BOLD,24);table.setRowHeight(30);table.addMouseListener(this); jtfYear.addActionListener(this);bAdd.addActionListener(this);bDel.addActionListener(this);bLastYear.addActionListener(this);bNextYear.addActionListener(this);bLastMonth.addActionListener(this);bNextMonth.addActionLis
35、tener(this);p1.add(bLastYear); p1.add(jtfYear); p1.add(bNextYear);p1.add(bLastMonth);p1.add(jtfMonth);p1.add(bNextMonth);p2.add(bAdd);p2.add(bDel);p3.add(jsp, BorderLayout.CENTER); p3.add(p2, BorderLayout.SOUTH);p3.add(ld, BorderLayout.NORTH);p4.add(l);p4.add(lt);18p5.add(p4, BorderLayout.SOUTH);p5.
36、add(sp, BorderLayout.CENTER);p5.add(p1, BorderLayout.NORTH);this.getContentPane().add(p5, BorderLayout.CENTER);this.getContentPane().add(p3, BorderLayout.EAST);String strDate = DateFormat.getDateInstance().format(new Date().split(“-“);cld.set(Integer.parseInt(strDate0), Integer.parseInt(strDate1)-1,
37、 0);showCalendar(Integer.parseInt(strDate0), Integer.parseInt(strDate1), cld);jtfMonth.setEditable(false);jtfYear.setText(strDate0);jtfMonth.setText(strDate1);this.showTextArea(strDate2);ld.setFont(new Font(“新宋体“,Font.BOLD,24);new Timer(lt).start();this.setBounds(200,200,600,320);this.setResizable(f
38、alse);this.setVisible(true);public void showCalendar(int localYear, int localMonth, Calendar cld)int Days = getDaysOfMonth(localYear, localMonth) + cld.get(Calendar.DAY_OF_WEEK) - 2;Object ai = new Object7;lastTime = 0;for (int i = cld.get(Calendar.DAY_OF_WEEK)-1; i = Days; i+)aii%7 = String.valueOf
39、(i-(cld.get(Calendar.DAY_OF_WEEK)-2);if (i%7 = 6)dtm.addRow(ai);ai = new Object7;lastTime+;dtm.addRow(ai);public int getDaysOfMonth(int year, int Month) 19if(Month = 1 | Month = 3 | Month = 5 | Month = 7 | Month = 8 | Month = 10 | Month = 12)return 31;if(Month = 4 | Month = 6 | Month = 9 | Month = 1
40、1)return 30;if(year%4 = 0 elsereturn 28;public void actionPerformed(ActionEvent e)if(e.getSource() = jtfYear | e.getSource() = bLastYear | e.getSource() = bNextYear |e.getSource() = bLastMonth | e.getSource() = bNextMonth)int m, y;tryif (jtfYear.getText().length() != 4)throw new NumberFormatExceptio
41、n();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 lastTime+1; i+) dtm.removeRow(0);20if(e.getSourc
42、e() = bLastYear) jtfYear.setText(String.valueOf(-y); if(e.getSource() = bNextYear)jtfYear.setText(String.valueOf(+y); if(e.getSource() = bLastMonth)if(m = 1)jtfYear.setText(String.valueOf(-y);m = 12;jtfMonth.setText(String.valueOf(m);elsejtfMonth.setText(String.valueOf(-m);if(e.getSource() = bNextMo
43、nth)if(m = 12)jtfYear.setText(String.valueOf(+y);m = 1;jtfMonth.setText(String.valueOf(m);elsejtfMonth.setText(String.valueOf(+m);cld.set(y, m-1, 0);showCalendar(y, m, cld);if(e.getSource() = bAdd)int r = table.getSelectedRow();int c = table.getSelectedColumn();if(!ld.getText().equals(“没有选择日期“)tryFi
44、le file = new File(ld.getText() + “.txt“);BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file);21bw.write(jta.getText();bw.close();catch (FileNotFoundException ex)ex.printStackTrace();catch (IOException ex)ex.printStackTrace();if(e.getSource() = bDel)int r = table.g
45、etSelectedRow();int c = table.getSelectedColumn();File filedel = new File(ld.getText() + “.txt“);if(filedel.exists()if(filedel.delete()jta.setText(“日志删除成功“);elsejta.setText(“日志删除失败“);elsejta.setText(“没有找到日志文件“);public void mouseClicked(MouseEvent e)jta.setText(null);int r = table.getSelectedRow();in
46、t c = table.getSelectedColumn();if (table.getValueAt(r,c) = null) ld.setText(“没有选择日期“); else22 this.showTextArea(table.getValueAt(r,c); public void mousePressed(MouseEvent e) public void mouseReleased(MouseEvent e) public void mouseEntered(MouseEvent e) public void mouseExited(MouseEvent e) private
47、void showTextArea(Object selected)ld.setText(jtfYear.getText()+“年“+jtfMonth.getText()+“月“+selected+“日“);File filein = new File(ld.getText() + “.txt“);if(filein.exists()tryBufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filein);String strRead = br.readLine();jta.setTe
48、xt(null);while(strRead != null)jta.append(strRead);strRead = br.readLine();br.close();catch (FileNotFoundException ex)ex.printStackTrace();catch (IOException ex)ex.printStackTrace();public static void main(String args)JFrame.setDefaultLookAndFeelDecorated(true);JDialog.setDefaultLookAndFeelDecorated(true);new wannianli();23class Timer extends Thread/显示系统时间private JLabel lt;private SimpleDateFormat fy = new SimpleDateFormat(“yyyy.MM.dd G at HH:mm:ss z“);private SimpleDa