java课程设计报告.docx

上传人:b****8 文档编号:23912658 上传时间:2023-05-22 格式:DOCX 页数:28 大小:133.62KB
下载 相关 举报
java课程设计报告.docx_第1页
第1页 / 共28页
java课程设计报告.docx_第2页
第2页 / 共28页
java课程设计报告.docx_第3页
第3页 / 共28页
java课程设计报告.docx_第4页
第4页 / 共28页
java课程设计报告.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

java课程设计报告.docx

《java课程设计报告.docx》由会员分享,可在线阅读,更多相关《java课程设计报告.docx(28页珍藏版)》请在冰豆网上搜索。

java课程设计报告.docx

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;i

if(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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1