北邮Java程序设计作业3.docx
- 文档编号:6237438
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:14
- 大小:216.61KB
北邮Java程序设计作业3.docx
《北邮Java程序设计作业3.docx》由会员分享,可在线阅读,更多相关《北邮Java程序设计作业3.docx(14页珍藏版)》请在冰点文库上搜索。
北邮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; } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北邮 Java 程序设计 作业