北邮Java程序设计作业3.docx
《北邮Java程序设计作业3.docx》由会员分享,可在线阅读,更多相关《北邮Java程序设计作业3.docx(14页珍藏版)》请在冰豆网上搜索。
![北邮Java程序设计作业3.docx](https://file1.bdocx.com/fileroot1/2023-3/19/5d811e19-3013-4772-b083-2715ebba53e4/5d811e19-3013-4772-b083-2715ebba53e41.gif)
北邮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;iai[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;iif(leapYear(i))
total=total+366;
else
total=total+365;
for(inti=1;itotal=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;iai[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;iif(leapYear(i))
total=total+366;
else
total=total+365;
for(inti=1;itotal=total+getMonthDay(year,i);
returntotal;
}
}