Java小日历 课程设计报告.docx
《Java小日历 课程设计报告.docx》由会员分享,可在线阅读,更多相关《Java小日历 课程设计报告.docx(17页珍藏版)》请在冰豆网上搜索。
Java小日历课程设计报告
Java小日历
1.课程设计的目的
Java的前身是Oak,它一开始只是被应用于消费性电子产品中。
后来它的开发者们发现它还可以被用于更大范围的Internet上。
1995年,Java语言的名字从Oak编程了Java。
1997年J2SE1.1发布。
1998年J2SE1.2发布,标志Java2的诞生。
十多年来,Java编程语言及平台成功地运用在网络计算及移动等各个领域。
Java的体系结构由Java语言、Javaclass、JavaAPI、Java虚拟机组成。
它具有简单、面向对象、健壮、安全、结构中立、可移植和高效能等众多优点。
Java支持多线程编程,Java运行时系统在多线程同步方面具有成熟的解决方案。
Java的平台标准有JavaME,JavaSE和JavaEE。
Java发展到今天,它的卓越成就及在业界的地位毋庸置疑。
目前在众多的支持Java的开发工具中主要的7有JavaDevelopmentKit,NetBeans,Jcreator,JBuilder,JDeveloper和Eclipse等。
其中JavaDevelopmentKit简称JDK是大多开发工具的基础。
以上的每种开发工具都有优缺点,对于开发者来说,重要的是要根据自己的开发规模、开发内容和软硬件环境等因素来选择一种合适的开发工具。
本课程设计是一个JAVA小日历组件的设计,利用Frame框架类、面板类进行图形化界面设计,实现小日历的公历显示等功能。
2.设计方案论证
2.1设计思路
本程序的要求为:
①.使用图形用户界面;
②.本程序能够实现日期与星期的查询。
在设计小日历中的重要内容如下
javaCalendar方法:
Calendar抽象类定义了足够的方法,让我们能够表述日历的规则。
我们也可以自己的Calendar实现类,然后将它作为Calendar对象返回(面向对象的特性)。
在Calendar的方法中,get()和add()会让Calendar立刻刷新。
本程序的中心设计即是利用Calendar类来实现。
javaxswingJSpinner用法:
让用户从一个有序序列中选择一个数字或者一个对象值的单行输入字段。
它能够方便地选择日期、数字或列表中的选项。
Spinner通常提供一对带小箭头的按钮以便逐步遍历序列元素。
键盘的向上/向下方向键也可循环遍历元素。
也允许用户在Spinner中直接输入合法值。
JSpinner显示不同的内容,采用不同的模型,像SpinnerDateModel,SpinnerListModel,SpinnerNumberModel,只要对模型修改,就可以实现想要的精确的功能。
本程序利用该组件实现了年份的修改。
setOpaque用法:
setOpaque(false)的作用是将button的背景色改为其parent的背景色。
如果为true,则该组件绘制其边界内的所有像素。
否则该组件可能不绘制其某些或所有像素,从而允许其下面的像素透视出来。
基于JavaSwing的超链接标签和超链接按钮的实现:
java.awt.Desktop类的java.awt.Desktop.isDesktopSupported()可以获取当前系统是否支持javaawt桌面扩展.如果支持可以获取当前系统的Desktop,则使用:
java.awt.Desktopdp=java.awt.Desktop.getDesktop();
dp.browse(.URI);就可以启动系统默认的浏览器。
本程序自定义一个超链接标签控件[LinkLabel]类进行实现该功能。
java中实现表格的多表头显示:
主要就是三个应用类ColumnGroup,GroupableTableHeader,GroupableTableHeaderU和一个示例类GroupableHeaderExample。
(1)本小日历设计主体结构
设计一个框架MainFrame,然后在MainFrame里添加一个MainPanel面板。
定义一个MainPanel面板类,该面板以边布局格式,所有其他面板、标签等均添加到所设定的面板中。
(2)MainPanel面板北部(上方),添加一个年月面板YearMonthPanel
该年月面板主要放年份显示、月份显示、标题显示。
YearMonthPanel面板也使用边布局格式,西部添加一个年份面板,放年份信息;中部添加一个TextPanel面板,放标题文本显示信息;东部添加一个月份面板MonthPanel,放月份下拉框信息。
(3)MainPanel主面板的中部添加
添加一个DaysPanel面板用于放置月份的天数表格信息。
(4)MainPanel主面板的南部(下方)添加
添加一个InfoPanel面板,主要用于放置显示个人信息。
(5)InfoPanel面板上设计添加一个超级链接标签
该链接可以链接到个人空间
2.2设计方法
(1)流程图设计
图1流程图
(1)设计类及对象设计
在本程序中:
定义了一个Frame类,主要定义一个窗体框架,用于显示日历信息,并在主函数中只创建一个该窗体对象实现程序功能。
定义了一个主日历面板类Xiaorili,其中包含了日历设计所用到的全局变量、功能函数等,在Frame类里定义了其对象。
在该日历面板类里又设计了一个内部类CalendarTable表格类,用于布局日历天的显示格式。
为了设计一个超级链接,定义了一个LinkLable类,单独保存在一个文件LinkTbale.java中,在日历面板类Xiaorili里定义了其对象。
(2)程序设计思路
①.总天数的算法:
首先用if语句判断定义年到输入年之间每一年是否为闰年,是闰年,该年的总天数为366,否则,为365。
然后判断输入的年是否为定义年,若是,令总天数S=1,否则,用累加法计算出定义年到输入年之间的总天数,再把输入年的一月到要输出的月份之间的天数累加起来,若该月是闰年中的月份并且该月还大于二月,再使总天数加1,否则,不加,既算出从定义年一月一日到输出年的该月一日的总天数。
②.输出月份第一天为星期几的算法:
使总天数除以7取余加2得几既为星期几,若是7,则为星期日。
③.算出输出月份第一天为星期几的算法:
算出输出月份第一天为星期几后,把该日期以前的位置用空格补上,并总该日起一次输出天数直到月底,该月中的天数加上该月一日为星期几的数字再除以7得0换行,即可完整的输出该月的日历。
④.如果年份小于1582年则程序不予判断。
3.设计结果与分析
(1)运行程序,出现日历界面:
图2主界面
(2)单击年份的组合框侧边箭头,改变年份,则日历跟随改变:
图3改变年份
(3)单击月份下拉框,改变月份,则日历也跟随改变:
图4改变月份
(4)鼠标移动到“访问志文工作室”标签上,则字体颜色变为绿色:
图5访问空间
(5)鼠标单击超级链接标签,则调用默认浏览器打开了我的空间:
图6我的空间
4.设计体会
本次课程设计我决定做日历的设计。
主要考虑到以前时间少课程内容多,JAVA课程基础内容掌握并不是很抓实,而对于设计一个小日历程序,由于其功能简单设计也相对较易,对于我的学习情况比较合适,并且通过设计这样的一个日历小组件,也能使自己对JAVA的一些基础知识掌握的更加牢固。
对于本程序的设计,首先考虑其功能有哪些,需要显示什么,如何进行窗体构建布局,需要用哪些知识点,如相关的类和对象等。
最后,就是根据初步设计的功能和布局构架,考虑用源代码进行实现了。
经过了长时间的反复编写调试,课本和网上查阅相关资料相关文章,终于完成了整个课程设计。
在这个过程中,在把书本上的知识给系统的复习了一下的同时,同时也发现了自己的太多不足,对JAVA语言整体知识构架不够熟悉,不能灵活地运用所学的知识点。
自己的编程方式也不是太标准,经常出现代码写错而调试很久的低级错误情况出现。
通过这次课程设计,我明白了编写程序,不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力。
还要熟悉常用的编程技巧和编程思想,不能只关心程序的运行结果,更要注重程序代码的结构,编程者更要有严谨地态度。
还有通过设计过程中大量地查阅网络文章,对一些关键知识点逐个地了解并解决相关问题。
5.参考文献
[1]耿祥义.Java大学实用教程[M].北京:
电子工业出版社,2008.5:
1-260
[2]曾令明.Java程序设计教程[M].北京:
北京邮电大学出版社,2007.8:
34-120
[3]宛延闿.实用Java程序设计教程[M].北京:
机械工业出版社,2006.4:
234-250
[4]叶核亚.Java程序设计实用教程(第2版)[M].北京:
电子工业出版社,2008.4:
311-363
[5]朱喜福.Java程序设计[M].北京:
人民邮电出版社,2005.9:
179-203
附录
(1)Xiaoril.java文件部分代码:
importjava.awt.*;
importjava.awt.event.*;
importjava.util.*;
importjavax.swing.*;
importjavax.swing.event.*;
importjavax.swing.table.*;
publicclassXiaoriliextendsJApplet{
//==================================================
/*定义全局变量*/
publicstaticfinalColorbackground=Color.white;//背景色
publicstaticfinalColorforeground=Color.black;//前景色
publicstaticfinalColorheaderBackground=Color.DARK_GRAY;//星期
publicstaticfinalColorheaderForeground=Color.white;//星期前景色
publicstaticfinalColorselectedBackground=Color.green;//选中背景色
publicstaticfinalColorselectedForeground=Color.white;//选中前景色
publicstaticfinalStringWeekSun="星期日";//星期标签名称
publicstaticfinalStringWeekMon="星期一";
publicstaticfinalStringWeekTue="星期二";
publicstaticfinalStringWeekWed="星期三";
publicstaticfinalStringWeekThu="星期四";
publicstaticfinalStringWeekFri="星期五";
publicstaticfinalStringWeekSat="星期六";
privateJPanelMainPanel;//日历面板
privateJLabelyearsLabel;//“年份”标签
privateJSpinneryearsSpinner;//年份组合框
privateJLabelmonthsLabel;//“月份”标签
privateJComboBoxmonthsComboBox;//12月份下拉框
privateJLabeltextLabel;//标题显示标签
privateJLabelInfoLabel;//个人信息显示标签
privateJTabledaysTable;//日表格
privateAbstractTableModeldaysModel;//天单元表格
privateCalendarcalendar;//日历对象
//==================================================
/*函数定义*/
publicXiaorili(){//构造函数
MainPanel=(JPanel)getContentPane();
}
publicvoidinit(){//初始化面板界面函数
MainPanel.setLayout(newBorderLayout());
calendar=Calendar.getInstance();//默认方式,以本地的时区和地区来构造Calendar
//--------------------------------------
yearsLabel=newJLabel("年份:
");//设置年份标签显示
yearsSpinner=newJSpinner();//构造年份spinner组合框
yearsSpinner.setEditor(newJSpinner.NumberEditor(yearsSpinner,"0000"));
yearsSpinner.setValue(newInteger(calendar.get(Calendar.YEAR)));
yearsSpinner.addChangeListener(newChangeListener(){//注册该组合框的事件监听器
publicvoidstateChanged(ChangeEventchangeEvent){
intday=calendar.get(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DAY_OF_MONTH,1);
calendar.set(Calendar.YEAR,((Integer)yearsSpinner.getValue()).intValue());
intmaxDay=calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DAY_OF_MONTH,day>maxDay?
maxDay:
day);
updateView();//更新显示
}
});
//--------------------------------------
JPanelyearMonthPanel=newJPanel();//定义年月面板
MainPanel.add(yearMonthPanel,BorderLayout.NORTH);//添加年月面板到日历面板的南面(最上方)
yearMonthPanel.setLayout(newBorderLayout());//边布局模式
JPanelyearPanel=newJPanel();//构建年份面板
yearMonthPanel.add(yearPanel,BorderLayout.WEST);//年份面板添加到年月面板西部(左边)
yearPanel.setLayout(newBorderLayout());//设置年份面板为边布局并添加年份标签和组合框
yearPanel.add(yearsLabel,BorderLayout.WEST);
yearPanel.add(yearsSpinner,BorderLayout.CENTER);
//--------------------------------------
monthsLabel=newJLabel("月份:
");//设置月份标签显示
monthsComboBox=newJComboBox();//月份下拉框
for(inti=1;i<=12;i++){//构造下拉框的12个月份
monthsComboBox.addItem(newInteger(i));
}
monthsComboBox.setSelectedIndex(calendar.get(Calendar.MONTH));//下拉框当前月份为选中状态
monthsComboBox.addActionListener(newActionListener(){//注册月份下拉框的事件监听器
publicvoidactionPerformed(ActionEventactionEvent){
intday=calendar.get(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DAY_OF_MONTH,1);
calendar.set(Calendar.MONTH,monthsComboBox.getSelectedIndex());
intmaxDay=calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DAY_OF_MONTH,day>maxDay?
maxDay:
day);
updateView();//更新面板显示
}
});
//--------------------------------------
JPanelmonthPanel=newJPanel();//定义月份面板
yearMonthPanel.add(monthPanel,BorderLayout.EAST);//添加月份面板到年月面板的东面(右面)
monthPanel.setLayout(newBorderLayout());//月份面板设为边布局方式
monthPanel.add(monthsLabel,BorderLayout.WEST);//添加月份名称标签到月份面板西面(左面)
monthPanel.add(monthsComboBox,BorderLayout.CENTER);//添加月份下拉框到月份面板中间
//--------------------------------------
textLabel=newJLabel("JAVA小日历");//设置标题标签显示
JPaneltxetPanel=newJPanel();//定义标题文本显示面板
yearMonthPanel.add(txetPanel,BorderLayout.CENTER);//添加标题文本显示面板到年月面板中间
txetPanel.add(textLabel,BorderLayout.CENTER);//添加标题文本标签到面板
//--------------------------------------
InfoLabel=newJLabel("学号:
f0983107姓名:
麻红丽班级:
09计专升本");//设置个人信息标签显示
JPanelInfoPanel=newJPanel();//定义底部个人信息显示面板
MainPanel.add(InfoPanel,BorderLayout.SOUTH);//添加个人信息显示面板到日历面板南方(下方)
InfoPanel.add(InfoLabel);//添加信息标签文本标签到面板
//--------------------------------------
JPanelLink=newJPanel();//设置超级链接到我的空间
InfoPanel.add(newLinkLabel("访问我的空间","
//--------------------------------------
daysModel=newAbstractTableModel(){//设置7行7列
publicintgetRowCount(){
return7;
}
publicintgetColumnCount(){
return7;
}
publicObjectgetValueAt(introw,intcolumn){
if(row==0){//第一行显示星期
returngetHeader(column);
}
row--;
Calendarcalendar=(Calendar)Xiaorili.this.calendar.clone();
calendar.set(Calendar.DAY_OF_MONTH,1);
intdayCount=calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
intmoreDayCount=calendar.get(Calendar.DAY_OF_WEEK)-1;
intindex=row*7+column;
intdayIndex=index-moreDayCount+1;
if(indexdayCount){
returnnull;
}else{
returnnewInteger(dayIndex);
}
}
};
daysTable=newCalendarTable(daysModel,calendar);//构造日表格
daysTable.setCellSelectionEnabled(true);//设置表格单元格可选择
daysTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
daysTable.setDefaultRenderer(daysTable.getColumnClass(0),newTableCellRenderer(){
publicComponentgetTableCellRendererComponent(JTabletable,Objectvalue,booleanisSelected,
booleanhasFocus,introw,intcolumn){
Stringtext=(value==null)?
"":
value.toString();
JLabelcell=newJLabel(text);
cell.setOpaque(true);//绘制边界内的所有像素
if(row==0){//第一行显示星期,设置为星期的前景色和背景色
cell.setForeground(headerForeground);
cell.setBackground(headerBackground);
}else{
if(isSelected)