装订线
北京师范大学2015~2016学年春季学期期末Java程序设计作业试卷课程名称: Java程序设计任课教师姓名:孙一林
卷面总分: 100 分考试时长:分钟考试类别:闭卷□开卷
其他□院(系):信息科学与技术学院专业:计算机科学与技术年级: 2014 姓名:刁诗哲学号:
阅卷教师(签字):
评价准则:
(1)应用程序设计思想………………………………………………… ≤ 20% (2)程序结构表述……………………………………………………… ≤ 20% (3)调试、运行、结果………………………………………………… ≤ 20% (4)报告+程序文档………………………………………………………≤ 20% (5)应用程序展示(5分钟讲解与演示)……………………………≤ 10% (6)应用程序难易度……………………………………………………≤ 10%
设计要求:
选择一题,按自己理解设计程序,在报告(该试卷首页为报告第1页,文件名及格式为:*.doc或*.docx,* = 学号 + 姓名,报告为必要项)中给出设计思路、程序结构、调试、模拟运行、结果等说明内容,提交作业(设计、调试、运行、结果):报告+程序所有(源程序、类、打包等)文件的压缩文档(学号 + 姓名)。设计题目难易度依照题号顺序由小到大。
多功能日历记事本
一、整体介绍
1.外观显示
日历外观如下图所示,全局大体分为四个部分:左上,左下,右上,右下。
最上面是标题栏,显示该程序的名称,如我的程序显示的为“刁诗哲的日历”。标题栏下方为菜单栏,菜单栏目前有两个菜单,分别是“功能设置”和“关于”。
左上部分为日历界面,显示一个万年历,用户可以在输入框中输入所查年份和月份,按下回车后自动跳转到该月。左下部分是显示图片部分,用户可以自主设置自己喜欢的图片,设置这一功能主要是给用户提供个性化的用户体验,可以根据自己的喜
好设置喜爱的图片,比如放置一个名人座右铭可以勉励自己在学业上不断进步。右上为记事本区域,用户可以选中日期后输入自己想要保存的记事,同时,用户可以设置提醒时间(闹钟)。在右下方是一个钟表,不仅可以为用户提供实时查看时间的服务,同时也可以作为闹钟使用。
2.基本功能
1)万年历功能
左上方的日历相当于一个万年历,可以为用户提供一个日期的查看功能,可以显示日历的年月日,并且对今天的日历给出了特殊的显示(大字体和蓝色显示)。还能查看当前时间之前和之后的日历,可以通过按钮操作,也支持在输入框里面输入年和月。如上图
2)记事本的编辑、查看和删除功能
右上方提供备忘录(记事本)功能,用户可以记录下来之前发生的事情以作纪念,也可以记录下来未来想要做的事情以防遗忘
3)闹钟功能
用户点击设置闹钟时间后,便可以设置闹钟时间,到达预定时间后闹钟会播放音乐,当然,闹钟提醒音乐也可以自己设置。
4)使用帮助
3.高级功能
1)时区设置
我们为用户提供了多达75个时区的选择,点击更改时区即可将时间切换到当前用户所在的时区,可以满足用户去往不同国家的需求。是一款“国际化”日历。
2)自定义图片
用户点击更改图片背景,可以选择自己喜欢的图片,为用户提供了多样化选择。可以根据自己的喜好设置喜爱的图片,比如放置一个名人座右铭可以勉励自己在学业上不断进步。
3)自定义音乐
考虑到普通闹钟刺耳的缺点,我们给用户提供定制化铃声的功能,让用户可以自己设置闹钟铃声,提供了个性化的用户体验。
4)保留自定义设置
用户的自定义设置功能都会被记录,下次打开软件时还能保留先前的设置。是一款真正的人性化、个性化日历
二、设计思路
首先,按照功能将日历分成不同模块,分别是CalendarImage(显示图片),CalendarPad(实现主要功能,主要框架),mainclass(main方法),NotePad(显示
记事本),myClock(钟表的显示),Month(月份的设置和显示),Year(年份的设置和显示)。
图 1 根据功能设计日历模块
首先按照日历所要实现的功能,从外观显示和内部功能设计日历。
日历的外观共分为四个部分,分别是顶部的菜单栏,左上部分显示日历面板,右上部分显示记事本面板,左下部分显示图片,右下部分显示表盘,包括电子表显示和钟表表盘显示。
日历的内部功能:
实现记事本功能:包括获取日志,显示日志,删除日志
实现闹钟功能:包括钟表的显示,不同时区的设置,和到时提醒功能
日历日期的显示:包括月份的设置,年份的设置
根据以上功能的划分,按照面向对象编程的设计思想,将同一对象所应用的功能合并到一个对象上,可以将日历的实现划分为以下几个模块。
图 2 面向对象的日历设计
三、程序结构
1.总体结构
在设计多功能日历时,需要编写7个java源文件:, , , , ,,。这些类的主要功能如下:
主类 mainclass(用于启动程序)
主要框架mainclass(是程序的核心)
记事本NotePad(记事本功能)
年Year(显示年)
月Month(显示月份)
日历图像CalendarImage(显示日历图像)
数字时钟myClock(用于显示数字时钟)
类之间的关系如下图所示
2.详细设计
package diaoshizhe;
import这是程序的主类;程序从这个类开始;
public class mainclass {
public mainclass() {
}
;
import .*;
import .*;
import .*;
public class myClock extends JApplet implements Runnable { /**
*
*/
private static final long serialVersionUID = 1L;
Thread clock;
int ringhour;
int ringmin;
Calendar calendar = new GregorianCalendar);
Date timenow;
Clock nowClock;
public myClock(){
start(); idth;
int h=getBounds().height;
setBounds(0,0,w,h); ;
import .*;
import
;
import .*;
import
;
import .*;
import .*;
oURL());idth;
int h=getBounds().height;
(image,0,0,w,h,this);
}
}
四、调试
在调试过程中遇到了很多问题,可以说是一边写代码一遍调试的(个人认为这也是正确方法,如果写完所有代码再调试就太晚了),在调试的过程中遇到了很多问题,在这里举最关键的,印象最深的问题列举。
遇到的问题1:
日历面板如何设计,怎样才能较完整的实现日历的功能,在这个方面的设计我头脑有点晕,分不清几个模块如何拼接在一起。如何显示日历面板,通过百度我搜索了一下前人的经验,又看了一些优秀案例,同时参照自己电脑上的日历,有了解决方法。
解决:
设置一个大的JPanel叫做leftUp(因为左上角是日历,所以名字叫leftUp),然后设置几个小的组建,分别是
JPanel leftUp_center=new JPanel();// leftUp_center为窗口的leftUp的中间部分,用于显示日历; JPanel leftUp_north=new JPanel();//leftUp_north为窗口的leftUp的上部分,用于显示年月及相关按钮;
JPanel leftUp_center_east=new JPanel();//leftUp_center_east是窗口的leftUp_center的东边部分,用来显示日历每天的星期和号数;
使用以上方法就将一个大的日历划分成几个小的模块,然后一一实现就简单了
遇到的问题2:
记事本功能如何实现,如果做到保存用户输入的记事,并且还能有保存日志功能和删除日志功能
解决:
//读取记录日志的文件;
FileInputStream inOne=new FileInputStream(file);
ObjectInputStream inTwo=new ObjectInputStream(inOne);
table=(Hashtable
();
();
//把读到的内容写到指定存储日志的文件中;
FileInputStream inOne=new FileInputStream(file);
ObjectInputStream inTwo=new ObjectInputStream(inOne);
table=(Hashtable)();
();
();
(key,logContent);//注意key和logContent是对应的映射;
FileOutputStream out=new FileOutputStream(file);
ObjectOutputStream objectOut=new ObjectOutputStream(out);
(table); //把内容写进文件中;
();
();
//删除当前时间对应的日志;
FileInputStream inOne=new FileInputStream(file);
ObjectInputStream inTwo=new ObjectInputStream(inOne);
table=(Hashtable
();
();
(key);//移除;
FileOutputStream out=new FileOutputStream(file);
ObjectOutputStream objectOut=new ObjectOutputStream(out);
(table);
();
();
(null);//清空显示的文档;
遇到的问题3:
如何实现更改图片背景的功能我设置了让用户选择图片,但是发现不起作用
解决:
经过调试我发现,原来我只是设置了一个模态对话框,让用户可以选择文件,但是选择的文件并没有真正利用起来,于是我对文件进行了操作,让获取的文件在指定区域显示便可以了。
遇到的问题4:
钟表表盘和电子数码显示不一致,发现时钟总是比表盘慢了一秒,如图,秒针没有对齐12点刻度
解决:
后来发现自己的问题在于,我的时钟获取的时间是使用变量hour,minute,second来设置的,而电子时钟的显示是使用即时获取时间
,
,
;
因此我做了相应的修改取消了使用hour,minute,second等变量保存的方式,而是都改为即时获取。
遇到的问题5:
如何做到修改时区,并且我还想实现尽可能多的时区
解决:
我百度了一下方法告诉我是,开始使用方法不对没有正确显示,后来发现该语句要这样使用:
Calendar calendar = new GregorianCalendar);
是我设置的一个成员变量,可以让用户方便的修改不同时区,但是问题又来了,如何知道不同时区的准确名称呢因为不同时区的名称很复杂,比如Europe/Paris是罗马时间也可以表示法国时间,这些怎么知道呢,通过百度我发现了在JDK/jre/lib 文件夹下有一个tzmappings文件,储存了各个时区,然后我给每个时区设置一个编号,让用户输入编号而不是输入全称,就可以让用户方便快捷的设置时区。
五、模拟运行
六、结果与反思
基本实现了初步设想的功能
1) 万年历功能
2) 记事本的编辑、查看和删除功能
3) 闹钟功能
4) 使用帮助
高级功能:
1) 时区设置
2) 自定义图片
3) 自定义音乐
4) 保留自定义设置
还有一些有待继续改进的地方和新功能,比如:
1.农历的添加
农历是中国人使用较多的日历,市面上大多数日历都可以实现农历的显示,因此在未来的版本中,添加农历是我的首要功能。
2.节假日的添加
为了让日历更加多功能,而不是仅仅只有显示日期这一作用,添加节假日可以更加符合用户的生活习惯,帮助用户查看即将到来的重要节日。另外,在设置时区的时候,也可以选择将不同国家的不同法定节日显示出来
3.多视图模式
以windows自带的日历为例,可以看出在右上角有一个多视图,可以以全年的视角查看月份,也可以以全月的视角查看每月的日期,还可以以星期的视角查看一周的时间,为同学们查看自己的记事提供了方便。
4.界面的美化
目前界面还是有些简单,希望可以做的美观一些。
图 3windows自带日历
七、收获与感想
一个学期的java课程结束了,从一开始的课程到做完这个大作业,感受颇多。
首先是对每周实验的感受,感受到了每周做的实验的重要性,尤其是在做这个大作业的时候,需要用的非常多老师上课讲的内容,有时候老师讲完还不能完全理解,当做实验的时候遇到了问题,解决之后就会体悟很深,这让我真正喜欢上每次的实验。
其次是对自己学习能力的感慨。以前觉得自己自学能力不强,但是通过这么多次实验,遇到了那么多的问题,我努力的查找百度的资料,翻java课本,解决了狠多困难。尤其是在最后这次大作业,一开始自己的思路都很乱,但是看了几个优秀案例之后,我开始模仿已有的做,不仅仅是模仿实现基本功能的样例,也模仿更加优秀的样例(比如windows自带的日历,个人认为功能非常全面并且美观)。在这个过程中,通过自学有了很大的提升。
最后是对老师的感谢。非常感谢老师,我是个问题很多的学生(哈哈),在上课的时候问了老师很多问题,还有课下发邮件也会问很多问题,老师都一一为我耐心的解答。
非常感谢老师一个学期以来的付出,谢谢老师!