万年历设计报告.docx
- 文档编号:1586730
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:22
- 大小:309.69KB
万年历设计报告.docx
《万年历设计报告.docx》由会员分享,可在线阅读,更多相关《万年历设计报告.docx(22页珍藏版)》请在冰点文库上搜索。
万年历设计报告
JAVA程序设计报告
题目:
万年历程序设计
学习中心:
批次:
层次:
专升本
专业:
计算机科学与技术
姓名:
摘要:
Java是一种简单的,面向对象的,分布式的,解释型的,健壮安全的,结构中立的,可移植的,性能优异、多线程的动态语言。
该报告中的程序是使用JAVA程序编写的,使用图形用户界面;实现日期与星期的查询。
关键字:
万年历程序;JAVA语言;Eclipse
目录
前言…………………………………………4
1、设计分析………………………………6
2、程序结构………………………………7
3、各模块的功能及程序说明……………7
4、源程序…………………………………8
5、操作方法………………………………25
6、试验结果………………………………27
7、设计体会………………………………29
前言:
1、Java语言是简单的。
Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用Java。
另一方面,Java丢弃了C++中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。
特别地,Java语言不使用指针,并提供了自动的废料收集,使得程序员不必为内存管理而担忧。
2、Java语言是一个面向对象的。
Java语言提供类、接口和继承等原语,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。
Java语言全面支持动态绑定,而C++语言只对虚函数使用动态绑定。
总之,Java语言是一个纯的面向对象程序设计语言。
3、Java语言是分布式的。
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(javanet),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。
Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
4、Java语言是健壮的。
Java的强类型机制、异常处理、废料的自动收集等是Java程序健壮性的重要保证。
对指针的丢弃是Java的明智选择。
Java的安全检查机制使得Java更具健壮性。
5、Java语言是安全的。
Java通常被用在网络环境中,为此,Java提供了一个安全机制以防恶意代码的攻击。
除了Java语言具有的许多安全特性以外,Java对通过网络下载的类具有一个安全防范机制(类ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类SecurityManager)让Java应用设置安全哨兵。
6、Java语言是体系结构中立的。
Java程序(后缀为java的文件)在Java平台上被编译为体系结构中立的字节码格式(后缀为class的文件),然后可以在实现这个Java平台的任何系统中运行。
这种途径适合于异构的网络环境和软件的分发。
7、Java语言是可移植的。
这种可移植性来源于体系结构中立性,另外,Java还严格规定了各个基本数据类型的长度。
Java系统本身也具有很强的可移植性,Java编译器是用Java实现的,Java的运行环境是用ANSIC实现的。
8、Java语言是解释型的。
如前所述,Java程序在Java平台上被编译为字节码格式,然后可以在实现这个Java平台的任何系统中运行。
在运行时,Java平台中的Java解释器对这些字节码进行解释执行,执行过程中需要的类在联接阶段被载入到运行环境中。
9、Java是高性能的。
与那些解释型的高级脚本语言相比,Java的确是高性能的。
事实上,Java的运行速度随着JIT(Just-In-Time)编译器技术的发展越来越接近于C++。
10、Java语言是多线程的。
在Java语言中,线程是一种特殊的对象,它必须由Thread类或其子(孙)类来创建。
通常有两种方法来创建线程:
其一,使用型构为Thread(Runnable)的构造子将一个实现了Runnable接口的对象包装成一个线程,其二,从Thread类派生出子类并重写run方法,使用该子类创建的对象即为线程。
值得注意的是Thread类已经实现了Runnable接口,因此,任何一个线程均有它的run方法,而run方法中包含了线程所要运行的代码。
线程的活动由一组方法来控制。
Java语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为synchronized)。
11、Java语言是动态的。
Java语言的设计目标之一是适应于动态变化的环境。
Java程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。
这也有利于软件的升级。
另外,Java中的类有一个运行时刻的表示,能进行运行时刻的类型检查。
Java语言的优良特性使得Java应用具有无比的健壮性和可靠性,这也减少了应用系统的维护费用。
Java对对象技术的全面支持和Java平台内嵌的API能缩短应用系统的开发时间并降低成本。
Java的编译一次,到处可运行的特性使得它能够提供一个随处可用的开放结构和在多平台之间传递信息的低成本方式。
特别是Java企业应用编程接口(JavaEnterpriseAPIs)为企业计算及电子商务应用系统提供了有关技术和丰富的类库。
本程序设计中,开发的是万年历程序,规模较小,内容也较单一,选择了Eclipse开发工具。
1、设计分析
①需求分析:
现在网络上各种万年历程序特别多,功能也是应有尽有,可是这类软件存在的最大问题就是太占空间了,功能太过繁杂,对初学者来说不太容易掌握。
从日常应用来说,一个万年历只需实现日期与星期的查询功能就可以了。
本程序就是依照此理念设计。
②功能设计
本程序参照了WINDOWS操作系统的万年历工具,其功能有以下几个方面:
(1)菜单中有“年份下拉”、“月份下拉”二个主菜单。
(2)“年份下拉”有“2008”、“2009”、“2010”等年份。
(3)“月份下拉”中有“一月”“二月”“三月”“四月”等月份。
2、程序结构
图1程序结构说明
3、各模块的功能及程序说明
①各模块的功能说明
图2各模块的功能
②程序说明
整个万年历分为2大块:
菜单下拉框和内容显示区。
(1)privateString[]为程序菜单下拉框。
(2)IntegergetShow()为内容显示区。
4、源程序
/**
*@(#)AidyCalender.java
*
*
*@author
*@version1.002008/7/19
*/
importjava.awt.*;
importjava.awt.event.*;
importjava.lang.StringBuffer;
importjavax.swing.*;
importjava.util.*;
importjavax.swing.Timer;
importjavax.swing.border.*;
publicclassAidyCalenderextendsJFrameimplementsActionListener,ItemListener{
Datedate=newDate();
privateGregorianCalendargregorianCalendar=newGregorianCalendar();
//定义中英文字符数组存储星期信息,用于转换显示
privateString[]stringWeekEn=newString[]{"SUN","MON","TUE","WED",
"THU","FRI","SAT"};
privateString[]stringWeekCn=newString[]{"星期日","星期一","星期二","星期三",
"星期四","星期五","星期六"};
//定义存储月份的信息数组,用于转换显示方示
privateString[]stringMonthEn=newString[]{"Jan","Feb","Mar","Apr",
"May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"};
privateString[]stringMonthCn={"一月","二月","三月","四月","五月","六月",
"七月","八月","九月","十月","十一月","十二月"};
privateString[]sysNowTime=newString[6];//sysNowTime用于存储系统时间的变量
privateString[]sysRunTime=newString[6];
privateJLabel[]labelWeek=newJLabel[7];
privateJLabel[]labelDay=newJLabel[42];
privateJLabellabelTime=newJLabel();
privateJPanelpanel1=newJPanel();
privateJPanelpanel2=newJPanel();
privateJPanelpanel3=newJPanel();
privateJComboBoxcombo1=newJComboBox();
privateJComboBoxcombo2=newJComboBox();
privateJButtonbuttonToday=newJButton();
privateBorderborder=BorderFactory.createRaisedBevelBorder();
privateBorderborder1=BorderFactory.createLineBorder(Color.cyan,3);
publicAidyCalender(Stringtitle){
super(title);
for(inty=1900;y<2101;y++){
combo1.addItem(""+newInteger(y).toString()+"年");
}
for(intm=0;m<12;m++){
combo2.addItem(""+stringMonthCn[m]);
}
buttonToday.setText("今天");
setLayout(newFlowLayout());
add(panel1);
add(panel2);
add(panel3);
panel1.setLayout(newGridLayout(1,3,10,0));
panel1.add(combo1);
combo1.addItemListener(this);
panel1.add(combo2);
combo2.addItemListener(this);
panel1.add(buttonToday);
buttonToday.addActionListener(this);
labelTime.setFont(newFont("宋体",Font.PLAIN,16));
labelTime.setForeground(Color.MAGENTA);
panel1.add(labelTime);
Timertime=newTimer(1000,newTimerListener());
time.addActionListener(newTimerListener());
//time.setRepeats(true);
time.start();
//labelTime.addAncestorListener(newTimerListener());
panel2.setLayout(newGridLayout(7,7,0,10));
panel2.setBackground(Color.white);
for(inti=0;i<7;i++){
labelWeek[i]=newJLabel();
labelWeek[i].setHorizontalAlignment(0);
if(i==0||i==6){
labelWeek[i].setBackground(Color.blue);
labelWeek[i].setForeground(Color.RED);
labelWeek[i].setFont(newFont("黑体",Font.BOLD,14));
}
else{
labelWeek[i].setForeground(Color.BLACK);
labelWeek[i].setFont(newFont("新宋体",Font.PLAIN,14));
}
labelWeek[i].setText(stringWeekCn[i]);
panel2.add(labelWeek[i]);
}
for(inti=0;i<42;i++){
labelDay[i]=newJLabel();
labelDay[i].setHorizontalAlignment(0);
labelDay[i].setText("");
panel2.add(labelDay[i]);
}
addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
System.exit(0);
}
});
setSize(300,300);
setBounds(250,200,400,360);
setVisible(true);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getSysDate();
setNowDate();
}
publicvoidactionPerformed(ActionEventae){
if(ae.getSource()==buttonToday){
setNowDate();
}
}
publicvoiditemStateChanged(ItemEventaa){
setChangeDate();
}
publicintturnWeek(Stringweek){
inti;
for(i=0;i<7;i++)
if(week.equalsIgnoreCase(stringWeekEn[i]))
break;
returni;
}
publicintturnMonth(Stringmonth){
/**
*intturnMonth(Stringmonth)
*@month系统日期中的月,诸如Jan\Feb
*@returnint
*返回一个整数值,用于寻找stringMonthCn[]数组中对应的中文月份
*/
inti;
for(i=0;i<12;i++)
if(month.equalsIgnoreCase(stringMonthEn[i]))
break;
returni;
}
/**
*setNowDate()
*设置当前系统日期
*/
publicvoidsetNowDate(){
setSysDate(getNowYear(),getNowMonth());
getSysRunDate();
setDateNull();
combo1.setSelectedIndex(getShowYear()-1900);
combo2.setSelectedIndex(getShowMonth());
setDays(getMonthDays(getNowYear(),getNowMonth()),getInitWeek(sysRunTime[0]),getNowDay());
//labelTime.setText(sysNowTime[3]);
//labelTime.setHorizontalAlignment(0);
}
/**IntegergetShowYear()
*获取组合框中应该显示的年份
*/
publicvoidsetSysDate(intyear,intmonth){
gregorianCalendar.set(year,month,1);
}
publicvoidsetDateNull(){
for(inti=0;i<42;i++){
labelDay[i].setText("");
}
}
publicvoidsetChangeDate(){
setSysDate(getComboYear(),getComboMonth());
getSysRunDate();
setDateNull();
setDays(getMonthDays(getComboYear(),getComboMonth()),getInitWeek(sysRunTime[0]),-1);
}
publicintgetMonthDays(intyear,intmonth){
/**
*返回所选年月的天数,因为数组中的数值从0开始,所以3\5\8\10分别代表4\6\9\11几个小月.
*而1代表2月,经过是否为闰年判断,选择返回28或29天.
*其余月份为大月,返回31天.
**/
switch(month){
case3:
case5:
case8:
case10:
return30;//小月返回30天
case1:
if(gregorianCalendar.isLeapYear(year)){
//isLeapYear(year)确定当前纪元中的指定年份是否为闰年。
return29;
}else{
return28;
}//闰年的二月返回29天,平年返回28天
default:
return31;
//大月返回31天
}
}
/**
*intgetComboYear()
*获取组合框中的年份
*/
publicvoidgetSysDate(){
date=gregorianCalendar.getTime();
sysNowTime=(date.toString()).split("");
}
publicvoidgetSysRunDate(){
date=gregorianCalendar.getTime();
sysRunTime=(date.toString()).split("");
}
publicintgetComboYear(){
returncombo1.getSelectedIndex()+1900;
}
/**
*intgetComboMonth()
*获取月组合框中的整数值,
*/
publicintgetComboMonth(){
returncombo2.getSelectedIndex();
}
publicintgetInitWeek(StringinitWeek){
/**
*getWeekNow(StringinitWeek)
*@paranowWeek系统日期中的星期
*返回当月中的1号是从星期几开始
*/
intnowWeek=0;
for(inti=0;i<7;i++){
if(initWeek.equalsIgnoreCase(stringWeekEn[i])){
nowWeek=i;
break;
}
}
returnnowWeek;
}
publicintgetNowYear(){
returnInteger.parseInt(sysNowTime[5]);
}
publicintgetNowMonth(){
intnowMonth=0;
for(inti=0;i<12;i++){
if(sysNowTime[1].equalsIgnoreCase(stringMonthEn[i]));
nowMonth=i;
break;
}
returnnowMonth;
}
publicintgetNowDay(){
returnInteger.parseInt(sysNowTime[2]);
}
publicIntegergetShowYear(){
returnInteger.parseInt(sysNowTime[5]);
}
publicIntegergetShowMonth(){
/**
*IntegergetShowMonth()
*获取在组给框中显示的中文格式月份:
如七月\八月等
*/
returnturnMonth(sysNowTime[1]);
}
publicvoidsetDays(intmonthDays,intinitWeek,intday){
/**
*voidsetDays(intmonthDays,intinitWeek,intday)
*@paramonthDays本月天数
*@parainitWeek初始星期
*@paraday今天日
*设置月历
*/
setDateNull();
for(inti=initWeek;i if((i-initWeek+1)==day){ labelDay[i].setBorder(border1); labelDay[i].setForeground(Color.BLUE); labelDay[i].setFont(newFont("黑体",Font.BOLD,20)); }elseif((i%7==0)||(i%7==6)) labelDay[i].setForeground(Color.RED); else{ labelDay[i].setForeground(Color.BLACK); } label
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 万年历 设计 报告