java课程设计报告.docx
《java课程设计报告.docx》由会员分享,可在线阅读,更多相关《java课程设计报告.docx(28页珍藏版)》请在冰豆网上搜索。
![java课程设计报告.docx](https://file1.bdocx.com/fileroot1/2023-5/22/a1eb9f60-5a24-4008-8169-88067085f71c/a1eb9f60-5a24-4008-8169-88067085f71c1.gif)
java课程设计报告
《Java程序设计》课程设计报告
题目:
万年历
学院:
数学与统计
专业:
信息与计算科学
*******
学号:
************
*******
2017年7月9日
1需求分析
1.1需求分析
本程序的要求为:
(1)能够显示实现1800-2100年的日期,包括公历、农历、星期、二十四节气。
(2)能够按照月份格式显示,或按照星期格式显示。
(3)能够显示系统时间。
(4)能够设置闹钟。
(5)能够查询若干国际大城市(分布在不同时区)的时间。
1.2功能设计
本程序要构建的万年历程序,其功能有以下几个方面:
一、设计程序运行界面,具有显示各种功能的面板模块,并对各功能按钮就行时间监听;
二、程序需要显示1800年到2100年的日历,包括公历、农历、时间所对应的星期。
要求系
统能够从界面上的操作获取公历日期,计算其所对应的星期和相应的农历并显示到界面上;
三、程序要求显示系统时间,并能设置闹铃。
要求可以自己设置一个时间点,在这一时间点
做出相应的响应;
四、查询显示若干国际城市不同时区的时间,这里只需要调用Java的系统里就可以解决。
五、对时间的更新,日历显示要求关联系统时间,能在进入程序时显示系统时间对应的日历,
并能返回当天日历;
六、程序界面的美观设计和人性化结构,要求具有良好的人机交互,容易理解界面内容,易
操作;
七、就现在的水平来说,功能1、2、3、5是可以实现,功能4有待研究,可能遇到的问题是
按钮对时间的监听处理可能难度较大,还有就是在公历转农历中可能比较难获取相应的公历
变化日期。
2.概要设计
2.1程序设计思路
1.总天数的算法:
首先用if语句判断定义年到输入年之间每一年是否为闰年,是闰年,该年的总天数为366,否则,为365。
然后判断输入的年是否为定义年,若是,令总天数S=1,否则,用累加法计算出定义年到输入年之间的总天数,再把输入年的一月到要输出的月份之间的天数累加起来,若该月是闰年中的月份并且该月还大于二月,再使总天数加1,否则,不加,既算出从定义年一月一日到输出年的该月一日的总天数。
2.输出月份第一天为星期几的算法:
使总天数除以7取余加2得几既为星期几,若是7,则为星期日。
3.算出输出月份第一天为星期几的算法:
算出输出月份第一天为星期几后,把该日期以前的位置用空格补上,并总该日起一次输出天数直到月底,该月中的天数加上该月一日为星期几的数字再除以7得0换行,即可完整的输出该月的日历。
4.获取系统时间,计算当天农历日期并显示
2.2程序运行界面
2.3流程图
3.各模块的功能及程序说明
3.1.初始化组件
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
importjavax.swing.table.DefaultTableModel;
importjava.text.DateFormat;
importjava.text.SimpleDateFormat;
importjava.util.Calendar;
importjava.util.Date;
importjava.util.GregorianCalendar;
importjava.util.Locale;
importjava.util.TimeZone;
3.2.初始化数据
publicclasswannianliextendsJFrameimplementsActionListener,MouseListener{
privateCalendarcld=Calendar.getInstance();//获取一个Calendar类的实例对象
privateString[]astr={"星期一","星期二","星期三","星期四","星期五","星期六","星期日"};
privateDefaultTableModeldtm=newDefaultTableModel(null,astr);
privateJTabletable=newJTable(dtm);
privateJScrollPanesp=newJScrollPane(table);
privateJButtonbLastYear=newJButton("上一年");
privateJButtonbNextYear=newJButton("下一年");
privateJButtonbLastMonth=newJButton("上月");
privateJButtonbNextMonth=newJButton("下月");
privateJPanelp1=newJPanel();//设立八个中间容器,装入布局控制日期的按钮模块
privateJPanelp2=newJPanel(newGridLayout(3,2));//网格布局
privateJPanelp3=newJPanel(newBorderLayout());//边界布局
privateJPanelp4=newJPanel(newGridLayout(2,1));
privateJPanelp5=newJPanel(newBorderLayout());
privateJPanelp6=newJPanel(newGridLayout(2,2));
privateJPanelp7=newJPanel(newGridLayout(2,1));
privateJPanelp8=newJPanel(newBorderLayout());
privateJComboBoxtimeBox=newJComboBox(TimeZone.getAvailableIDs());//对所有支持时区进行迭代,获取所有的id;
privateJTextFieldjtfYear=newJTextField(5);//jtfYeaar年份显示输入框
privateJTextFieldjtfMonth=newJTextField
(2);//jtfMouth月份显示输入框
privateJTextFieldtimeField=newJTextField();//各城市时间显示框
privatestaticJTextAreajta=newJTextArea(10,5);//农历显示区
privateJScrollPanejsp=newJScrollPane(jta);
privateJLabell=newJLabel("花江小精灵:
亲!
你可以直接输入年月查询.");
privateJLabellt=newJLabel();
privateJLabelld=newJLabel();
privateJLabellu=newJLabel("农历和节气");
privateJLabelnull1=newJLabel();
privateintlastTime;
//privateStringlocalTime=null;
privateStrings=null;
privateSimpleDateFormatdateFormat=newSimpleDateFormat("yyyy年MM月dd日hh时mm分ss秒");
3.3.绘制程序界面
publicwannianli(){
super("花江日历过去仅留追忆,未来刚生憧憬,唯有坚守本心,把握今天ZYT詹永堂");//框架命名
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗口关闭函数
this.getContentPane().setLayout(newBorderLayout(9,10));
jta.setLineWrap(true);//长度大于分配长度时候则换行
jta.setFont(newFont("黑体",Font.BOLD,16));
table.setBackground(Color.white);
table.setGridColor(Color.pink);//星期之间的网格线是灰色的
table.setBackground(Color.white);
table.setColumnSelectionAllowed(true);//将table中的列设置为可选择
table.setSelectionBackground(Color.pink);//当选定时背景颜色为黑色
table.setSelectionForeground(Color.GREEN);
table.setBackground(newColor(184,207,229));//日期显示表格为浅蓝色
table.setFont(newFont("黑体",Font.BOLD,24));//日期数字字体格式
table.setRowHeight(26);//表格的高度
table.addMouseListener(this);//鼠标监听器、
lu.setFont(newFont("黑体",Font.BOLD,22));//农历标签格氏
jtfYear.addActionListener(this);//可输入年份的文本框
//为各个按钮添加监听函数
bLastYear.addActionListener(this);
bNextYear.addActionListener(this);
bLastMonth.addActionListener(this);
bNextMonth.addActionListener(this);
timeBox.addItemListener(newTimeSelectedChangedListener());
//将按钮添加到Jpane上
p1.add(bLastYear);
p1.add(jtfYear);//年份输入文本框
p1.add(bNextYear);
p1.add(bLastMonth);
p1.add(jtfMonth);
p1.add(bNextMonth);
p3.add(jsp,BorderLayout.SOUTH);
p3.add(lu,BorderLayout.CENTER);
p3.add(ld,BorderLayout.NORTH);
p4.add(lt);
p4.add(l);
p5.add(p4,BorderLayout.SOUTH);
p5.add(sp,BorderLayout.CENTER);
p5.add(p1,BorderLayout.NORTH);
p6.add(timeBox);
p6.add(null1);
p6.add(timeField);
p8.add(p2,BorderLayout.CENTER);
p8.add(p7,BorderLayout.SOUTH);
this.getContentPane().add(p3,BorderLayout.EAST);
this.getContentPane().add(p5,BorderLayout.CENTER);
this.getContentPane().add(p6,BorderLayout.SOUTH);
this.getContentPane().add(p8,BorderLayout.WEST);
String[]strDate=DateFormat.getDateInstance().format(newDate())
.split("-");//获取日期
cld.set(Integer.parseInt(strDate[0]),
Integer.parseInt(strDate[1])-1,0);
showCalendar(Integer.parseInt(strDate[0]),
Integer.parseInt(strDate[1]),cld);
jtfMonth.setEditable(false);//设置月份文本框为不可编辑
jtfYear.setText(strDate[0]);
jtfMonth.setText(strDate[1]);
this.showTextArea(strDate[2]);
ld.setFont(newFont("新宋体",Font.BOLD,24));
newTimer(lt).start();
newTimeThread().start();
this.setBounds(200,200,700,350);
this.setResizable(false);
this.setVisible(true);
3.4计算各个月的天数
运用if语句判断各个月的最大天数
publicintgetDaysOfMonth(intYear,intMonth){//计算各月的天数
if(Month==1||Month==3||Month==5||Month==7||Month==8||Month==10||Month==12)
{
return31;
}
if(Month==4||Month==6||Month==9||Month==11)
{
return30;
}
if(Year%4==0&&Year%100!
=0||Year%400==0)//闰年
{
return29;
}
else{
return28;
}
}
3.5年份输入控制
这个监听事件用于监听程序界面的操作,获取年月的相应数据,用if语句对月份操作进行控制,如当前年月为2017年1月时,点击“上一月”,年份减1,月份为12,即为2016年12月;当前月份为12时,点击“下一月”,年份加1,月份为1,如图
publicvoidactionPerformed(ActionEvente)//从界面上获取年月数据
{
if(e.getSource()==jtfYear||e.getSource()==bLastYear||e.getSource()==bNextYear||
e.getSource()==bLastMonth||e.getSource()==bNextMonth)
{
intm,y;
try//控制输入的年份正确,异常控制
{
if(jtfYear.getText().length()!
=4)
{
thrownewNumberFormatException();
}
y=Integer.parseInt(jtfYear.getText());
m=Integer.parseInt(jtfMonth.getText());
}
catch(NumberFormatExceptionex)
{
JOptionPane.showMessageDialog(this,"请输入4位0-9的数字!
","年份有误",JOptionPane.ERROR_MESSAGE);
return;
}
ld.setText("没有选择日期");
for(inti=0;iif(e.getSource()==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));
}
else
{
jtfMonth.setText(String.valueOf(--m));
}
}
if(e.getSource()==bNextMonth)
{
if(m==12)
{
jtfYear.setText(String.valueOf(++y));
m=1;
jtfMonth.setText(String.valueOf(m));
}
else
{
jtfMonth.setText(String.valueOf(++m));
}
}
cld.set(y,m-1,0);
showCalendar(y,m,cld);
}
}
3.6获取点击表格详细日期
publicvoidmouseClicked(MouseEvente)
{
jta.setText(null);
intr=table.getSelectedRow();
intc=table.getSelectedColumn();
if(table.getValueAt(r,c)==null)
{
ld.setText("没有选择日期");
}
else
{
this.showTextArea(table.getValueAt(r,c));
}
}
3.7打印日期
privatevoidshowTextArea(Objectselected)
{
ld.setText(jtfYear.getText()+"年"+jtfMonth.getText()+"月"+selected+"日");
3.8国际时间系统调用显示
privatevoidupdateTimeText(StringtimeZoneId){
if(timeZoneId!
=null){
TimeZonetimeZone=TimeZone.getTimeZone(timeZoneId);
dateFormat.setTimeZone(timeZone);
Calendarcalendar=Calendar.getInstance();
calendar.setTimeZone(timeZone);
timeField.setText(dateFormat.format(calendar.getTime()));
}else{
timeField.setText(null);
}
}
privateclassTimeSelectedChangedListenerimplementsItemListener{
publicvoiditemStateChanged(ItemEvente){
if(e.getStateChange()==ItemEvent.SELECTED){
if(e.getItem()instanceofString){
s=e.getItem().toString();
}
}
}
}
privateclassTimeThreadextendsThread{
publicvoidrun(){
while(true){
updateTimeText(s);
try{
Thread.sleep(100);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
}
3.9显示系统时间
classTimerextendsThread//显示系统时间
{
privateJLabellt;
privateSimpleDateFormatfy=newSimpleDateFormat("Gyyyy.MM.ddHH:
mm:
ss");
publicTimer(JLabellt)
{
this.lt=lt;
}
publicvoidrun()
{
while(true){
try{
lt.setText(fy.format(newDate()));
this.sleep(500);
}
catch(InterruptedExceptionex)
{
ex.printStackTrace();
}
}
}
}
3.10农历计算模块
本模块中,由于没有解决获取公历日期变动数据,只能显示系统时间,即只能显示当天农历
finalprivatestaticlong[]lunarInfo=newlong[]{0x04bd8,0x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,
0x056a0,0x09ad0,0x055d2,0x04ae0,0x0a5b6,0x0a4d0,0x0d250,0x1d255,0x0b540,0x0d6a0,0x0ada2,0x095b0,
0x14977,0x04970,0x0a4b0,0x0b4b5,0x06a50,0x06d40,0x1ab54,0x02b60,0x09570,0x052f2,0x04970,0x06566,
0x0d4a0,0x0ea50,0x06e95,0x05ad0,0x02b60,0x186e3,0x092e0,0x1c8d7,0x0c950,0x0d4a0,0x1d8a6,0x0b550,
0x056a0,0x1a5b4,0x025d0,0x092d0,0x0d2b2,0x0a950,0x0b557,0x06ca0,0x0b550,0x15355,0x04da0,0x0a5d0,
0x14573,0x052d0,0x0a9a8,0x0e950,0x