




已阅读5页,还剩20页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目 录一、摘要1二、程序分析1 2.1需求分析1 2.2功能设计1 2.3概要设计2-3 2.3.1程序设计思路2 2.3.2具体功能设计2 2.3.3程序流程图3三、详细设计4-123.1初始化组件43.2初始化程序数据,绘制程序面板4-73.3显示日期的方法8-113.4点击按钮产生的效果11-12四、运行结果13五、心得体会14六、参考文献15- 1 - 一、摘 要: 万年历是一个强大的日历系统,通过它可以实现对过去,现在以及将来日期的查询,通过在年份对话框中输入要查询的年份,再相应的在月份对应的下拉菜单选择要查询的月份,则可得到相应的日历。本实验是对图形用户界面,布局管理器的综合运用,理解JAVA的时间处理机制,编写独立运行的窗口。 2、 程序分析2.1需求分析本程序的要求为: 1.使用图形用户界面; 2.本程序能够实现日期与星期的查询。2.2功能设计本程序要构建的万年历程序,其功能有以下几个方面: 1.实现图形界面。 2.能以月历形式显示日期与星期。工作日、双休日、当天分别以黑色、红色和蓝色显示。 3.支持用户通过下拉形式菜单来选择月份。 4.通过点击“现在日期”来刷新日历。2.3概要设计2.3.1程序设计思路 1.月份总天数的算法:直接根据month_int,即月份序号判断该月的天数。当month_int等于2时,调用isLeapYear()方法判断是否为闰年。2.网格内容算法:用dt.getDate()方法算出输出月份第一天为星期几,第一天的格子序号应该为7+第一天的星期序号。算出输出月份第一天为星期几后,把该日期以前的位置用空格补上,并从该日起一次输出天数直到月底,该月中的天数加上该月一日为星期几的数字再除以7得0换行,即可完整的输出该月的日历。3.日期颜色的算法:格子数从0开始,第一行为星期序号,则日期从第7格开始。根据格子序号i进行判断,当i模7余数为0或者6时日期为周末,置为红色;当i等于第一天的格子序号加上当前日期减一时,置为蓝色;其余日期为黑色。4. 如果年份小于2001年大于2031年则程序不予判断。2.3.2具体功能设计数据选择列表:年份选择列表、月份选择列表。点击日期跳转按钮,即在日历中显示用户选择日期数据;点击现在日期按钮,即在日历中显示当前日期数据。2.3.3程序流程图是否计算,绘制屏幕是否选择日期提交年月变更数据 程序初始化结束获取当前系统时间年份等数据开始程序流程图三、详细设计3.1初始化组件import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;3.2初始化程序数据,绘制程序面板在初始化模块中,首先定义一个公共类 CalenderTrain,它继承自JFrame。ActionListener是一个接口,在实现此接口的类CalenderTrain中,给需要关注其动作的组件跳转按钮button_jump和现在日期按钮button_today添加监听器(addActionListener(this),之后在事件处理方法public void actionPerformed (ActionEvent e) 中,对每个事件进行不同处理。在这个类中,定义用到的标签、下拉列表框、按钮,放置面板。public class CalenderTrain extends JFrame implements ActionListener JComboBox Month = new JComboBox(); JComboBox Year = new JComboBox(); JLabel Year_l = new JLabel(年份:); JLabel Month_l = new JLabel(月份:); Date now_date = new Date(); JButton button_day = new JButton49; JButton button_jump = new JButton(日期跳转); JButton button_today = new JButton(现在日期); int now_year = now_date.getYear() + 1900; int now_month = now_date.getMonth(); boolean bool = false;String year_int = null; int month_int; JPanel pane_ym = new JPanel(); JPanel pane_day = new JPanel();JPanel pane_parent = new JPanel(); 调用CalenderTrain,设定面板标题为JAVA日历程序。只给窗口设置frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)的话,点击关闭按钮,执行的其实只有把窗口隐藏动作,在任务管理器中可以看到进程仍在运行。于是加上后面的代码,确保点击关闭,程序直接退出system。面板的大小设置为不能变化。public CalenderTrain() super(JAVA日历程序); setDefaultCloseOperation(DISPOSE_ON_CLOSE);addWindowListener(new WindowAdapter() public void windowClose(WindowEvent e) System.exit(0););setResizable(false); 设定年月时,规定年份的区间是当前年份的过去10年到当前年份的未来20年,月份区间为正常1-12月。由于在年份区间中,今年是所有年份中的第十一个,所以Year.setSelectedIndex()的参数为10时,年份刚好是2011。Pane_ym即放置年月下拉列表框以及两个控制按钮的面板。给“跳转按钮”和“现在日期”按钮添加监听事件。for (int i = now_year - 10; i = now_year + 20; i+) Year.addItem(i + );for (int i = 1; i 13; i+) Month.addItem(i + );Year.setSelectedIndex(10); button_jump.addActionListener(this); button_today.addActionListener(this); 初始化日期按钮并绘制。由于每一月第一天不能确定,即所在列的位置(星期)不能确定,加上第一行的星期序号,画一个7*7网格布局管理器GridLayout。GridLayout把容器分成指定行和列的若干个网格,每个组件占一个网格,从左向右、从上到下依次把组件添加进来。所有的网格都是同样大小的。GridLayout(7, 7)设置行列数为7*7。pane_day.setLayout(new GridLayout(7, 7);for (int i = 0; i 49; i+) button_dayi = new JButton( );pane_day.add(button_dayi);本程序中,对组件的布置、整形和定位授权给一个布局管理器,由布局管理器来负责。利用布局管理器可以做到:(1) 计算一个容器的所选尺寸和最小尺寸(2) 布置一个容器的组件。这里采用的是BorderLayout,按东南西北和中心将组件布置在容器的四周和中心。用setContentPane()方法把容器置为JFrame的内容面板。用pack()方法调整此窗口的大小,以适合其子组件的首选大小和布局实现全部显示,然后用show()方法显示出来。pane_parent.setLayout(new BorderLayout(); setContentPane(pane_day);setContentPane(pane_ym);pane_parent.add(pane_day, BorderLayout.SOUTH);pane_parent.add(pane_ym, BorderLayout.NORTH);setContentPane(pane_parent);pack();show();3.3显示日期的方法 根据bool的值,由if语句进行判断执行哪一显示日期的语句块,为true时,显示现在的时间;为false时,显示用户选定的时间。网格第一行,即0至6号格子,内容固定为星期序号,即“星期日”到“星期六”。void setDay() if (bool) year_int = now_year + ;month_int = now_month; else year_int = Year.getSelectedItem().toString();month_int = Month.getSelectedIndex();int year_sel = Integer.parseInt(year_int) - 1900; Date dt = new Date(year_sel, month_int, 1); GregorianCalendar cal = new GregorianCalendar(); cal.setTime(dt);String week = 星期日, 星期一, 星期二, 星期三, 星期四, 星期五, 星期六 ;int day = 0; int day_week = 0; for (int i = 0; i 7; i+) button_dayi.setText(weeki); 判断当前月份的天数,根据它来设定day的值,其中二月份要判断是否是闰年。因为第一行的星期序号已经占用了7个格子,所以day_week的值要加上7,即day_week = 7 + dt.getDay()。if (month_int = 0| month_int = 2| month_int = 4| month_int = 6 | month_int = 7| month_int = 9| month_int = 11) day = 31; else if (month_int = 3| month_int = 5| month_int = 8| month_int =10) day = 30; else if (cal.isLeapYear(year_sel) day = 29; else day = 28;day_week = 7 + dt.getDay(); 绘制GridLayout网格的内容。首先要根据选定的月份的第一天是星期几来确定我们绘制按钮的起始位置。前段代码中的day_week就是我们要绘制的起始位置。对于那些没有数值可以显示的按钮要置空。星期六和星期日以红色字体显示,工作日以黑色字体显示,当天以蓝色字体显示。对于没有日期数值显示的按钮进行置空处理。Count的值即网格的内容,值从1一直到day(当月的总天数)。int count = 1;for (int i = day_week; i day_week + day; count+, i+) if (i % 7 = 0| i = 13| i = 20| i = 27| i = 48| i = 34 | i = 41) if (i = day_week + now_date.getDate() - 1)button_dayi.setForeground(Color.blue);button_dayi.setText(count + ); else button_dayi.setForeground(Color.red);button_dayi.setText(count + ); elseif (i = day_week + now_date.getDate() - 1) button_dayi.setForeground(Color.blue);button_dayi.setText(count + ); else button_dayi.setForeground(Color.black);button_dayi.setText(count + );3.4点击按钮产生的效果 对监听器关注的按钮动作进行处理,点击“日期跳转”按钮时,将bool置为false,并调用setDay()方法重新绘制网格内容;点击“现在日期”按钮时,将bool置为true,得到今天的日期,将月份置为当前月份,将年份置为当前年份。public void actionPerformed(ActionEvent e) if (e.getSource() = button_jump) bool = false;this.setDay(); else if (e.getSource() = button_today) bool = true;this.setDay(); Month.setSelectedIndex(now_month);Year.setSelectedIndex(10); 四、运行结果五、心得体会 本次作业是对前面学过的所有面向对象的编程思想以及编程方法的一个总结、回顾和实践,因此,开始设计的时候要学会自己看书,明确本次作业设计所要用到的技术点并在网上搜索以及查阅相关的书籍来搜集资料。也非常感谢这次实验让我学到了不少知识。懂得了独立学习中非常重要的方法:自己分析问题,并根据需要查资料,分析资料,真正达到学以致用的目的。这学期的java程序设计是考查课,因此在平时上课时没有注意听讲,有很多东西在用的时候才发现不会应用,但是通过这次作业,我能够对java有大概的了解。不能说两三个礼拜能把java弄懂弄透,但是会用java语言编一些简单的小程序还是有很大收获的。在本次试验中主要还是回顾以前所学的编程语言中的循环和判断语句,而java的特别用处没有涉及太多,主要只是用了一些重要语句和主要结构。Java和C+在程序结构上有少许不同,在运行环境下则是完全不一样。Java需要配置变量和选取主类,这在之前都是没有接触过的。Java给了我另一种编程的体会。 在今后的学习中,我会利用课余时间来更好的学习java,它现在是一门应用很广的编译语言,我会在不断练习中提高自己的编程能力,在大学为今后的工作打下坚实的基础。六、参考文献1:java2 程序设计实用教程(第二版) 电子工业出版社 叶核亚编著2:Java大学简明教程作者:(美)戴尔特 电子工业出版社 译者:张琛恩附:程序源代码import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;public class CalenderTrain extends JFrame implements ActionListener JComboBox Month = new JComboBox(); JComboBox Year = new JComboBox(); JLabel Year_l = new JLabel(年份:); JLabel Month_l = new JLabel(月份:); Date now_date = new Date(); JButton button_day = new JButton49; JButton button_jump = new JButton(日期跳转); JButton button_today = new JButton(现在日期); int now_year = now_date.getYear() + 1900; int now_month = now_date.getMonth(); boolean bool = false;String year_int = null; int month_int;JPanel pane_ym = new JPanel(); JPanel pane_day = new JPanel(); JPanel pane_parent = new JPanel(); public CalenderTrain() super(JAVA日历程序); setDefaultCloseOperation(DISPOSE_ON_CLOSE);addWindowListener(new WindowAdapter() public void windowClose(WindowEvent e) /System.out.print(CLOSING THE WIN);System.exit(0););setResizable(false); for (int i = now_year - 10; i = now_year + 20; i+) Year.addItem(i + );for (int i = 1; i 13; i+) Month.addItem(i + );Year.setSelectedIndex(10);/Year.setText()pane_ym.add(Year_l); pane_ym.add(Year); Month.setSelectedIndex(now_month);pane_ym.add(Month_l); pane_ym.add(Month); pane_ym.add(button_jump); pane_ym.add(button_today); button_jump.addActionListener(this); button_today.addActionListener(this); pane_day.setLayout(new GridLayout(7, 7);for (int i = 0; i 49; i+) button_dayi = new JButton( );pane_day.add(button_dayi);this.setDay(); pane_parent.setLayout(new BorderLayout(); setContentPane(pane_day);setContentPane(pane_ym);pane_parent.add(pane_day, BorderLayout.SOUTH);pane_parent.add(pane_ym, BorderLayout.NORTH);setContentPane(pane_parent);pack();show();void setDay() if (bool) year_int = now_year + ;month_int = now_month; else year_int = Year.getSelectedItem().toString();month_int = Month.getSelectedIndex();/year_int=Year.getText();/month_int=Integer.parseInt(Month.getText();int year_sel = Integer.parseInt(year_int) - 1900;Date dt = new Date(year_sel, month_int, 1); GregorianCalendar cal = new GregorianCalendar();cal.setTime(dt);String week = 星期日, 星期一, 星期二, 星期三, 星期四, 星期五, 星期六 ;int day = 0; int day_week = 0; for (int i = 0; i 7; i+) button_dayi.setText(weeki);if (month_int = 0| month_int = 2| month_int = 4| month_int = 6| month_int = 7| month_int = 9| month_int = 11) day = 31; else if (month_int = 3| month_int = 5| month_int = 8| month_int = 10) day = 30; else if (cal.isLeapYear(year_sel) day = 29; else day = 28;day_week = 7 + dt.getDay();int count = 1;for (int i = day_week; i day_week + day; count+, i+) if (i % 7 = 0| i = 13| i = 20| i = 27| i = 48| i = 34| i = 41) if (i = day_week + now_date.getDate() - 1) button_dayi.setForeground(Color.blue);button_dayi.setText(count + ); else button_dayi.setForeground(Color.red);button_dayi.setText(count + ); else if (i = day_week + now_date.getDate() - 1) button_dayi.setForeground(Color.blue);button_day
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025江苏南通通州区金新街道招聘人力资源和社会保障基层公共服务平台工作人员2人备考练习题库及答案解析
- 游戏厅经营营销方案
- 古诗文吟唱活动方案策划
- 汕头税务咨询方案招聘
- 浙江厂房推拉棚施工方案
- 风电基础设施协同效应-洞察及研究
- 环境税政策效果评估-洞察及研究
- 油墨厂三乙二醇乙醚存储规章
- 同仁堂软文营销推广方案
- 2025-2026学年湖北省襄阳市荆楚联盟高二上学期9月月考数学试卷(含答案)
- 《旅游研究方法课程》-课程教学大纲
- 输变电工程质量通病防治手册
- 裂纹损伤容限评估技术
- 居民公约工作总结
- 大学研究生录取分析报告
- 骨科疾病的深度学习研究
- 社区零星维修工程投标方案(技术标)
- 绿植租摆服务投标方案(完整技术标)
- 高考英语典型看图作文(标准范文及高分范文)
- 《流水地貌》教学设计-湘教版必修一
- 矿山安全培训课件-地下矿山开采安全技术
评论
0/150
提交评论