北邮Java程序设计作业3.docx

上传人:b****5 文档编号:11569560 上传时间:2023-03-19 格式:DOCX 页数:14 大小:216.61KB
下载 相关 举报
北邮Java程序设计作业3.docx_第1页
第1页 / 共14页
北邮Java程序设计作业3.docx_第2页
第2页 / 共14页
北邮Java程序设计作业3.docx_第3页
第3页 / 共14页
北邮Java程序设计作业3.docx_第4页
第4页 / 共14页
北邮Java程序设计作业3.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

北邮Java程序设计作业3.docx

《北邮Java程序设计作业3.docx》由会员分享,可在线阅读,更多相关《北邮Java程序设计作业3.docx(14页珍藏版)》请在冰豆网上搜索。

北邮Java程序设计作业3.docx

北邮Java程序设计作业3

Java程序设计

 

 

题目:

课程作业三——实验报告

 

一、题目要求

作业要求:

按如下要求编写图形用户界面程序,最后提交纸质报告

报告要求:

包括设计思路、关键代码及运行结果

题目:

在以下题目中任选一题,也可以自由发挥,要求使用Java事件处理机制。

Java简易计算器

Java日历软件

Java记事本

Java学生信息管理系统

二、设计思路

1、设计图形界面

我们期望的图形界面大概是这个样子:

XXXX年XX月

年份:

1

2

3

4

(输入框)

5

6

7

8

9

10

11

月份:

12

13

14

15

16

17

18

(输入框)

19

20

21

22

23

24

25

查询按钮

26

27

28

29

30

备忘:

(输入框)

其中,只要在年份和月份对应的输入框中,输入一个年份、月份,按下查询按键,日历即可显示,最顶上的标题可以动态更新。

这是各个组件的关系示意图,其中,图中的p0、p1、p2为JPanel对象,方便安排我们的格局;label0、label1、label2三个对象,为JLable对象,用于显示三个标签,text1、text2、text3三个对象,为JTextField对象,用于输入年份月份,button1为JButton对象,用于按下以查询日历。

2、程序流程图

程序开始显示2014年12月的日历,当输入一个年份和月份时,判断是否合法,合法则输出该月的日历,不合法则输出一个空日历。

3、程序逻辑框图

以上是我们程序的逻辑框图。

首先利用leapYear()判断这一年是否为闰年;然后利用getMonthDay(),各个月份的日期相加,求出1800年以来,这个月之前共有多少天;然后利用getStartDay(),求出这个月开始的一天为星期几,再配合getMonthDay(),即可得到该月的日历。

再使用Showcal(),修改内部参数,即可在程序中显示出来。

三、关键代码分析

1构造方法:

publiccal(){

super("2012210637郑晨宇——Java作业·日历软件");//框架命名

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗口关闭函数

this.setBounds(400,150,550,340);//设置窗口的位置和大小

Containerc=getContentPane();

p1=newJPanel();//面板对象,

p3=newJPanel(newGridLayout(8,1,3,3));//在面板对象p3里使用网格布局管理器

p2=newJPanel(newGridLayout(7,7,10,1));//网格布局管理器

label0=newJLabel("年份:

");//标签组件

label1=newJLabel("月份:

");

label2=newJLabel("备忘录:

");

label3=newJLabel("");

text1=newJTextField("2014",1);//文本框

text2=newJTextField("12",1);

text3=newJTextField

(1);

button1=newJButton("查看");//按钮

inti;//中心面板中各个标签初始化(用显示日历7行7列)

for(i=0;i<7;i++)

p2.add(ai[i]=newJLabel(ast[i]));//第一行显示是周几(星期日到星期六)

for(i=7;i<49;i++)

p2.add(ai[i]=newJLabel(""));//暂时为空,在showcal中具体定义各月不同的显示

p3.add(label0);

p3.add(text1);

p3.add(label1);

p3.add(text2);

p3.add(button1);

p3.add(label2);

p3.add(text3);

p1.add(label3);

setVisible(true);

c.add(p1,BorderLayout.NORTH);

c.add(p3,BorderLayout.EAST);

c.add(p2,BorderLayout.CENTER);

button1.addActionListener(this);//注册年份、月份输入和ok按钮监听器

this.setVisible(true);//窗口可见

}//main主函数

这个构造方法首先构造了一个JFrame对象并初始化,然后将各个标签、输入框、按键赋初值,填入预定的panel中,在将panel填入框架的指定位置,最后设定了按键的监听器。

由于cal类已经实现了ActionListener接口(实现过程见后),所以使用该对象作为事件处理器即可。

2actionPerformed方法

publicvoidactionPerformed(ActionEvente){

if(e.getSource()==button1)

{

try//控制输入的年份正确,异常控制

{

if(text1.getText().length()!

=4)

thrownewNumberFormatException();

}

catch(NumberFormatExceptionex)

{

return;

}

Strings1=text1.getText();//得到输入的年份

year=Integer.parseInt(s1);//将年份转换为int型,year为静态变量

Strings2=text2.getText();//月份,同年份处理

month=Integer.parseInt(s2);

showcal(year,month);//调用显示日历的函数

}//showcal:

在中间面板中显示网格布局之后的日历主界面

}

当button按下时,产生了一个ActionEvent,被注册的事件监听器捕捉到。

捕捉后,首先将年份和月份转换为int型,再调用showcal函数(实现过程见后),显示这个月的日历。

3showcal方法

publicvoidshowcal(intyear,intmonth)

{

intmonthDay=getMonthDay(year,month);//得到一个月有多少天

intstartDay=getStartDay(year,month);//得到每个月开始是周几

//显示当前窗口中显示日历的年月

Stringrr=""+Integer.toString(year)+"年"+Integer.toString(month)+"月";

label3.setText(rr);//控制各月日历的正确显示

inti;

for(i=7;i

ai[i].setText("");

for(i=startDay+7;i

{

Stringbb;//存在意义:

便于实现setText函数的带格式输入

if(i-startDay-6<10)

bb=""+Integer.toString(i-startDay-6);//将int型转换为String型

else

bb=""+Integer.toString(i-startDay-6);

ai[i].setText(bb);

}

for(i=startDay+monthDay+7;i<49;i++)

ai[i].setText("");

}

首先调用getMonthDay和getStartDay方法(实现方法见后),获得这个月共有多少天,和这个月开始的一天是星期几,这样就得到了本月的日历。

然后将该月的日历保存到数组ai中,用来显示。

 

4leapYear方法

publicstaticbooleanleapYear(intyear)

{

if((year%400==0)||((year%4==0)&&(year%100!

=0)))

returntrue;

else

returnfalse;

}

这个方法判断这一年是不是闰年。

程序较为简单,不再赘述。

 

5getMonthDay方法

publicstaticintgetMonthDay(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(month==2)

if(leapYear(year))//闰年二月29天

return29;

else

return28;

return0;//ifmonthisincorrect.

//如果月份输入错误返回0.

}

这个方法用来得到这个月共有多少天。

程序较为简单,不再赘述。

 

6getStartDay方法

publicstaticintgetStartDay(intyear,intmonth)

{//从1800年1月1日开始

intstartDay1800=3;

longtotalDays=getTotalDays(year,month);

return(int)((totalDays+startDay1800)%7);

}

这个方法用来得到这个月的第一天是星期几。

程序较为简单,不再赘述。

7getTotalDays方法

publicstaticlonggetTotalDays(intyear,intmonth)

{

longtotal=0;

for(inti=1800;i

if(leapYear(i))

total=total+366;

else

total=total+365;

for(inti=1;i

total=total+getMonthDay(year,i);

returntotal;

}

这个方法遍历1800年之后的各年和本年的各月份,获得在这个月份之前,共有多少天(以1800年1月1日为起点)。

四、程序运行结果

1、进入程序

进入程序后,程序显示2014年12月的日历,日历正确。

 

2、修改日期

我们修改日期(2015年1月)以后,点击查询键,日历正确显示了2015年的日历。

点击右上角红叉可以退出程序。

五、源程序

importjava.awt.*;

importjava.awt.event.*;

importjavax.swing.*;

publicclasscalextendsJFrameimplementsActionListener{

staticintyear,month;//设置静态变量便于计算方法的实现

privateString[]ast={"日","一","二","三","四","五","六"};

privateJLabel[]ai=newJLabel[49];

privateJLabellabel0,label1,label2,label3;//标签

privateJTextFieldtext1,text2,text3;//输入框

privateJButtonbutton1;//按钮

privateJPanelp3,p1,p2;//面板

publiccal(){

super("2012210637郑晨宇——Java作业·日历软件");//框架命名

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗口关闭函数

this.setBounds(400,150,550,340);//设置窗口的位置和大小

Containerc=getContentPane();

p1=newJPanel();//面板对象,

p3=newJPanel(newGridLayout(8,1,3,3));//在面板对象p3里使用网格布局管理器

p2=newJPanel(newGridLayout(7,7,10,1));//网格布局管理器

label0=newJLabel("年份:

");//标签组件

label1=newJLabel("月份:

");

label2=newJLabel("备忘录:

");

label3=newJLabel("");

text1=newJTextField("2014",1);//文本框

text2=newJTextField("12",1);

text3=newJTextField

(1);

button1=newJButton("查看");//按钮

inti;//中心面板中各个标签初始化(用显示日历7行7列)

for(i=0;i<7;i++)

p2.add(ai[i]=newJLabel(ast[i]));//第一行显示是周几(星期日到星期六)

for(i=7;i<49;i++)

p2.add(ai[i]=newJLabel(""));//暂时空,在showcal中具体定义各月不同的显示

p3.add(label0);

p3.add(text1);

p3.add(label1);

p3.add(text2);

p3.add(button1);

p3.add(label2);

p3.add(text3);

p1.add(label3);

setVisible(true);

c.add(p1,BorderLayout.NORTH);

c.add(p3,BorderLayout.EAST);

c.add(p2,BorderLayout.CENTER);

button1.addActionListener(this);//注册年份、月份输入和ok按钮监听器

//text1.addActionListener(this);

//text2.addActionListener(this);

this.setVisible(true);//窗口可见

}//main主函数

publicstaticvoidmain(String[]args){

cala=newcal();

a.showcal(2014,12);//初始化显示2013年6月日历

}

//事件处理方法

publicvoidactionPerformed(ActionEvente){

//e.getSource()==text1||e.getSource()==text2||

if(e.getSource()==button1)

{

try//控制输入的年份正确,异常控制

{

if(text1.getText().length()!

=4)

thrownewNumberFormatException();

}

catch(NumberFormatExceptionex)

{

return;

}

Strings1=text1.getText();//得到输入的年份

year=Integer.parseInt(s1);//将年份转换为int型,year为静态变量

Strings2=text2.getText();//月份,同年份处理

month=Integer.parseInt(s2);

showcal(year,month);//调用显示日历的函数

}

}

//showcal:

在中间面板中显示网格布局之后的日历主界面

publicvoidshowcal(intyear,intmonth)

{

intmonthDay=getMonthDay(year,month);//得到一个月有多少天

intstartDay=getStartDay(year,month);//得到每个月开始是周几

//显示当前窗口中显示日历的年月

Stringrr=""+Integer.toString(year)+"年"+Integer.toString(month)+"月";

label3.setText(rr);//控制各月日历的正确显示

inti;

for(i=7;i

ai[i].setText("");

for(i=startDay+7;i

{

Stringbb;//存在意义:

便于实现setText函数的带格式输入

if(i-startDay-6<10)

bb=""+Integer.toString(i-startDay-6);//int型转换为String型

else

bb=""+Integer.toString(i-startDay-6);

ai[i].setText(bb);

}

for(i=startDay+monthDay+7;i<49;i++)

ai[i].setText("");

}

//leapYear:

判断是否为闰年

publicstaticbooleanleapYear(intyear)

{

if((year%400==0)||((year%4==0)&&(year%100!

=0)))

returntrue;

else

returnfalse;

}

//getMonthDay:

每月总天数

publicstaticintgetMonthDay(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(month==2)

if(leapYear(year))//闰年二月29天

return29;

else

return28;

return0;//ifmonthisincorrect.

//如果月份输入错误返回0.

}

//getStartDay:

返回每月第一天是周几

publicstaticintgetStartDay(intyear,intmonth)

{//从1800年1月1日开始

intstartDay1800=3;

longtotalDays=getTotalDays(year,month);

return(int)((totalDays+startDay1800)%7);

}

//getTotalDays:

从1800年1月1日到所查月份前总的天数

publicstaticlonggetTotalDays(intyear,intmonth)

{

longtotal=0;

for(inti=1800;i

if(leapYear(i))

total=total+366;

else

total=total+365;

for(inti=1;i

total=total+getMonthDay(year,i);

returntotal;

}

}

 

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

当前位置:首页 > 经管营销 > 经济市场

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

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