




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
辽宁工程技术大学
大型软件项目实训报告
一、实训目的
通过外出实训提高自己的实战能力,对软件编程项目有更深刻的理解。根据企
业对人才的具体需求,针对软件学院应届毕业生,开展以大型软件工程项目为目的
的实战训练,有效提升学生的项目实战能力和适应市场的能力,最终实现学生比较
理想的就业率和就业质量。
二、实训时间和地点
1.实训时间:2012年12月17~2013年1月25日
2.实训地点:辽宁省沈阳市达内职业培训学校
三、实训单位简介
沈阳达内科技有限公司是中国高端IT培训行业领导品牌,由美国国际数据集团
IDGVCPartners和集富亚洲JAFCOASIA投资,由来自SUN、IBM、亚信、华为、
东软、用友等国际知名IT公司的技术骨干、海外留学生和加拿大专业技术人员创办,
直接引进北美rr技术,结合中国rr企业的现状,定制化培养高端rr人才。
经过9年运营,沈阳达内科技有限公司在大学生rr就业培训领域积累了丰富的
专业经验与就业资源,实现了95%的专业就业率,78%的口碑入学率,学员平均毕
业薪资3800元/首月平均薪资。目前,达内IT培训团已经发展成为集培训、咨询、
开发、人才服务于一体的高新技术集团公司,公司下设达内高端IT培训、达内软件
人才服务中心、达内软件研发中心。
沈阳达内科技有限公司先后在中国软件业发达城市——北京、上海、广州、沈
阳、深圳、南京、武汉、杭州、西安、苏州、成都、大连、太原、长沙、重庆等20
多个城市,建立了30多家培训中心,年培养1万多名软件人才。已累计为IBM、微
软、摩托罗拉、华为、中软、用友、Yahoo、阿里巴巴、TOM、新浪、搜狐、百度、
联想、神州数码、大唐电信、亚信等知名IT企业培养输送7万多名中高级软件人才,
跨越电信、金融、电子政务(商务)、电力、通讯、搜索、欧美外包及对日外包等十数
个行业。
由于沈阳达内科技有限公司优秀的教学效果和行业领先的经营模式赢得了社会
各界的广泛赞誉和好评,近年来达内荣获了各界权威机构的颁奖:达内成为业界唯
一的一家2006、2007、2008、2009连续4年入选德勤评选的“中国高科技高成长
50强公司”、“亚太地区高科技高成长500强公司”,中关村管理委员会指定的“软
件人才培养示范基地”,被《计算机世界》评选的“就业服务杰出贡献奖”,被《中
国计算机报》评选的"最具影响力培训机构奖”,被搜狐评为“中国十大教育集团”,
被腾讯评为“中国大学生心目中最具影响力的IT品牌”等等。
四、实训内容
1.实训期间完成的学习任务
(1)Linux系统操作命令
首先,我们学习了最基础的系统操作指令。因为在学习过程中C和C++代码的编
程和修改在linux系统下,所以我们集中精力花费了3天时间学习指令操作。
命令:
文档统计:wc日期:datecal关机poweroffwindows:shutdown
Rebootexitfindgrepfind[目录列表]匹配标准-namesize-type-atime
通配符:
操作目录下有需要通配的内容的时候采使用通配符。*,[],?,!,{};1将上一
个命令的输出作为下一个命令的输入:cat/etc/passwdIgrep-nroottee
Is-11teea.txt
In硬连接软连接
Infile02fileIn-sfile02sfile
users:
who:
whoami:
whoami:
系统进程信息ps
psu:详细方式显示当前终端下的进程的信息
ps-e:当前正在运行的所有进程
sleep10&
killPID
jobs:查看任务
kill%nfg%nbg%nstop%nctrl+c/z
man帮助手册
(a)系统命令
(b)系统调用open
(c)库函数fopen
(d)管理员的命令ifconfigserviceifconfig
ip地址:netmask:默认网关:
域名解析netstatpingipexport
HOME:PWD:PATH:LANG:CC:CCC:PSI:PS2
exportPS1=""
-/.bashrcsource-/.bashrcxxx.sh
#!/bin/bashcaldateIsvi
命令模式:iahjklctrl+bfshift+90web$0x5xX5Xdd5dd
ywyyprRu:undo#G
底行命令模式:setnu
setcindent:按照C语言的风格进行自动缩进。
settabstop=4:设置tab按键的长度
行号+回车
字符串nN
/n个空格%s/string/replace/g
wfilename
#1,#2wfilename
qq!wq
geditkate
C程序的开发执行次序:
(a)写源文件,后缀名.c
(b)对代码中的指令进行预处理,以#开头的
(c)代码编译,生成xx.o/xx.obj
(d)代码的连接生成可执行文件a.out/xx.exe
(e)加载文件,把文件从硬盘读入内存
(f)执行
gcc的选项:
-C只编译不连接
-E只作预处理
-S汇编代码
-std=c89/c99
-o改变最后的可执行文件的名字
(2)Linux下Java程序开发
2.1循环语句(反复去做一件事)
1)while
a格式
while(表达式){
语句(循环体)
)
b当表达式为真的,执行循环体语句,如果表达式为假,
退出循环
c如果第1次执行循环的时候,表达式为假,则一次循环
都不执行,直接退出
d如何控制循环的次数?
循环变量,用来控制循环次数的变量,是非常重要的资源
2)for循环(企业开发最为常见的循环)
for(初始化表达式;boolean表达式;自增表达式){
循环体语句
验证码条码共13位,代表了一件商品编码,前12位
(692116851128)有具体代表含义,第13位是通过如下
01...
步骤算出来的:
第1步:取出该数的奇数位和,
cl=6+2+1+8+1+2=20
第2步:取出该数的偶数位和,
c2=9+1+6+5+14-8=30
第3步:将"奇数和"与"偶数和的三倍"相加,
cc=cl+c2*3=20+30*3=110
第4步:取结果的个位数(对10取余):
110的个位数为(110%10=0)
第5步:用10减去这个个位数:10-0=10
第6步:对得到的数再取个位数(对10取余):10%10=0
String:字符串,简化对char的操作,引用类型,表示一串字符(包含很多的
char)
2)Stringstr="692116851128";
下标:01234567891011
0——》6
1——》9
2——》2
str.charAt(i)//i指的下标,取出下标是i的单个字符
06
19
3)char--------》int
'6'!=6
0~9在编码级是连续
'6'-'0'=6
for2.demo4
4)do{
循环体语句
}while(表达式)
a首先执行一次循环体语句,再来判断表达式是true
还是false,如果true,继续执行循环体,如果false
直接退出循环
bdo{}while()不管表达式真还是假,都会执行
一次循环体
5)退出循环
abreak:退出整个循环
bcontinue:退出本次循环
6)循环嵌套
//java基础难点:循环嵌套,冒泡排序,选择排序,插入排序
一个循环的内部又包含一个循环
2.2数组
定义:一些相同类型的变量集合在了--起,就是数组,数组
大小必须固定
1)声明数组
数据类型口数组名字/数据类型数组名字口
eg:int[]a;
2)数组初始化
a静态初始化:int[]a={1,2,5,123,78);
b动态初始化:
int[]ary=newint[5];
int[]ary=newint[]{56,78,90);
3)访问数组
数组的下标:就是为了区分数组中的每个元素(变量)
下标:数组的下标永远都从0开始
访问数组元素的格式:数组名[下标值]
4)数组的长度(数组中元素的个数)
数组名.length--------->当前数组中元素的个数
数组的第1个元素的下标:0
数组的最后1个元素的下标是:length-1
2.3方法(函数):具有一定功能的代码块
publicstaticvoidmain(String[]args){}
1)格式
修饰词返回值类型方法名(形式参数列表)(
方法体
)
void:没有任何的返回值
2)没有参数没有返回值的方法
输出一句话
调用方法:方法名();
3)没有参数有返回值的方法
如果一个方法有返回值的话,必须要指明该返回值的数据类型
修饰词返回值类型方法名(形式参数列表)(
方法体
return返回值
}
4)含有参数的方法(值传递)
5)java中栈的变量分布
java程序启动的时候,会在内存中开辟两个区域,其中一个
用来保存局部变量(基本数据类型/引用类型对象地址值),
整个区域我们叫做栈,用来保存引用类型对象,叫做堆。
栈:后进先出
2.4数组中的一些常用的方法
arraycopy(aryl,0,ary2,0,aryl.length)
copyOf(目标,新数组的长度)
2.5排序
1)冒泡排序
特点:永远把最大的数放在后面,i只是比较轮次,
每次比较都是两两比较(5与U+1]比较)
2)选择排序
特点:永远是把最小的数放在前面,每轮都把小的数放到
前面,而且是i和j比较
2.6常用工具的方法
1)Random:随机
2)时间问题
3)针对数组最好的排序方法
2.7双色球
1)案例:实现随机生成双色球号码**
实现随机生成双色球号码:
[022213161812][12]
红球33个球(01-33)取六个
蓝球16个球(01-16)取一个
提示:
0101
0
truefalse...
0
红球池{"01","02","03","04",..."33")
蓝球池{"01","02","03","04",..."16")
使用标记{f,f,f,f,...f)
结果采用一个数组存储,数组可以利用数组扩容追加新的
“球号”,处理逻辑参考如下过程:
a.随机生成红球序号
b.检查"红球序号”是否使用过(取出过),如果使用过返回
第1步
C.取出•个红球,设置使用标记为true
d.判断是否取出了6个红球,如果没有到6个,返回第1步
e.对红球结果排序
f.取出一个篮球放入结果中
g.输出结果6+1(红+兰)
(3)面向对象概念
3.1Object>东西,Java程序员:想着对象写代码
class类名{
属性
构造方法
方法
}
类:事物的类型,人类,车类
类名:对象名=new构造方法;
对象:事物的实例,刘诗诗,门口刘老师的那辆28自行车
面向对象三大特征:封装,多态,继承,(抽象)
封装:对数据对代码尽可能不让外界看到
多态:事物在不同的情况下有不同的表现
花一>花朵,花钱,花心
美女一>凤姐,刘诗诗,高圆圆,班主任
继承:代码的重复利用
3.2类:
定义:代表一类事物.Eg:人类
类:
特征--—>基本属性
行为--->活动
3.3java中的类:
特征——>属性——>变量
行为——>方法
class类名{
属性
方法
)
3.4对象:
1)类跟对象之间的关系:
类是一类事物,类就是一个模板.eg:人类
对象是一个事物的实例.eg:刘英谦
2)java开发的特点:
a)设计类------------模板
b)实例化------------实现
3)声明/创建对象(实例化):
声明:类名对象名;
创建:对象名=new构造方法;
4)对对象属性和方法的访问:
对象名.属性名
对象名•方法名
5)引用类型的变量值:
引用类型的变量值:堆当中对象的地址的值,是通过引用类型
的变量来找到堆中的对象
3.5设id个长方体类(Box):
属性:长,宽,高
方法:求体积(长*宽*高)
创建一个长方体的对象,给长宽高分别赋值,最后求该
长方体对象的体积。
3.6构造方法:
(方便我们创建对象)
1)构造方法在new的时候,自动调用的(给属性赋值)
2)构造方法没有返回值类型
3)构造方法的名字跟类名一样
4)this:指示代词,指代一当前(对象),构造方法当中参数,按照企业开
发的规范,参数的名字,必须跟属性名保持一致,通过this来区分属性名和参数名
this.属性:当前对象的属性
classBox{
int1;
publicBox(int1)
(
this.l=1;
)
)
5)构造方法重载(构造方法的参数不同,方法名相同):
当new对象的时候,根据参数的不同,来调用不同的
构造方法
6)使用this()去调用一个类中其他构造方法:
this(参数):参数要跟调用的构造方法中的参数保持一致
(4)JavaBean规范
4.1javaBean不是sun语法规定,是企业开发中约定俗成.为了,使用方便.
原因:一般企业开发的时候,属性一般都是定义为私有,通过方法来简介访问
1)属性私有(尽可能)
2)一定要有空参的构造方法
3)javaBean一定要放到一个包内
4)为私有的属性,提供get/set方法
5)要实现序列化接口
4.2static:静态
修饰:方法,属性,代码块,内部类
含义:static修饰任何部分(方法,属性,代码块,内部类),该部分只跟类有关,跟对
象无关
1)静态属性:static修饰属性
该属性跟对象无关,跟类有关,而且所有的对象都可以去。
访问静态属性:
定义的格式:static数据类型变量名。
访问的方式:类名.属性名。
案例:统计一个班级的学生人数
分析:
classStudent{
Stringname;〃实例变量
staticintcount;〃静态变量
publicStudent(Stringname){
=name;
count++;
)
)
总结:静态变量是在堆单独开辟一块内存区域,用类名.静态变量名来访问,静
态变量只跟类有关,跟对象无关。
实例变量:跟对象有关,是属于这个对象的,但是可以通过对象.静态变量名
来访问静态变量。
2)代码块:
在一个类里面,用{代码},就是代码块,每次实例化的时候,都会执行一次,企业开
发中现在已经很少很少很少使用,功能很像构造方法。
3)静态代码块:
用static修饰一个代码块,static{代码块},创建对象(类加载)只执行一次。
4)静态方法:
用static修饰的方法,叫做静态方法,静态方法是类的方法。
调用方法:类名•方法名。
强调:静态不能调用实例变量。
静态方法:经常作为工具方法。
4.3final:
最终的final可以修饰属性,方法,类。
1)final来修饰类:
用final修饰的类,都不用使用子类去继承,sun提供的工具类很多都是final
类型的,egStringo
总结:企业开发中,尽量不要使用final来修饰我们自己的类,
struts2.x/strutsl.x,hibernate,spring,基于。反射实现,内部会频繁使用动态代理技术
(jdk/cglib)
2)final修饰方法:
用final修饰的方法,不能让子类再去重写该方法。
3)final修饰变量:
a用final修饰局部变量。
b用final修饰形式参数。
c用final对象o
4)java中常量的表达方法:
finalstatic数据类型变量名=值;
java中常量一定是所有字母全部大写(一般),常量一定要放到类当中,不
要放到main方法,因为常量是经常需要使用的。
4.4抽象类:
不是一个具体类,有些方法没有实现,需要靠子类继承,这个抽象类来实
现其方法。
1)抽象类有未实现的方法,需要靠子类继承这个抽象
类来实现其方法。
2)抽象类不能实例化,因为有未实现的抽象方法。
3)抽象类跟一般类只有一个区别,就是多了一个抽象
方法。
4)抽象类适合作为系统的分析和设计的工具。
5)判断题:含有抽象方法的类就是抽象类。
6)可以使用父类声明执行子类对象去实例化
格式:抽象类对象名=new子类构造方法
7)案例:设计车(抽象类)
属性:name,color,speed,money
方法:启动,刹车,运行-》均没有实现
Taxi(子类继承抽象类)
方法:全部实现(方法重写)
2.实训期间完成的实践项目
我在达内老师的带领下,学习了java基础之后,做了一个在线考试系统,虽然
程序比较简略,但是基本功能已经实现。
(1)功能介绍
(1.1)用户登录:
程序首页在用户第一次访问时会判断用户是否登录,未登录则显示用户登录窗
口,提示用户登录或注册.对于已经登录的用户,在用户登录窗口将显示用户的相关信
图1登录界面
代码如下:
packagecom.tarena.elts.ui;//UserInterface用户界面包
importjava.awt.BorderLayout;
importjava.awt.Color;
importjava.awt.FlowLayout;
importjava.awt.GridLayout;
importjava.awt.Point;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;
importjava.awt.event.WindowListener;
importjava.util.Timer;
importjava.util.TimerTask;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JPanel;
importjavax.swing.JPasswordField;
importjavax.swing.JTextField;
importjavax.swing.border.EmptyBorder;
/**
*登陆界面是一个具体的窗口框
*布局规划:
*JPanel(BorderLayout)contentPane
*1-(北)JLabel。登陆系统”)
*1—(中)JPanel(BorderLayout)centerPane
*Il-(4t)JPanel(GridLayout(2行,1歹ij))
*II—JPanel(BorderLayout)
*IIl--(西)JLable(编号:)
*IIl--(中)JTextField()
*II—JPanel(BorderLayout)
*H西)JLable(密码:)
*1—(中)JPasswordField
*1一(南)JPanel(FlowLayout)
*l-JButton(nLoginn)
*"JButton(”Cancel”)
*/
publicclassLoginFrameextendsJFrame{
publicLoginFrame(){
//super(“登陆");〃newJFrame(String)
init();
)
privatevoidinit(){〃初始化方法
setTitle("登陆)
this.setSize(3OO,220);
setLocationRelativeTo(null);//^中
add(createContentPane());
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
//setContentPane(createContentPane());
addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
clientContext.exit(LoginFrame.this);
)
});
)
privateJPanelcreateContentPane(){〃创建内容面板
JPanelp=newJPanel(newBorderLayoutO);
p.setBorder(newEmptyBorder(l0,10,10,10));
p.add(BorderLayout.NORTH,
newJLabel("登陆系统",JLabel.CENTER));
p.add(BorderLayout.CENTER,createCenterPane());
p.add(BorderLayout.SOUTH,createBottomPane());
returnp;
privateJPanelcreateBottomPane(){
JPanelp=newJPanel(newFlowLayout());
JButtonlogin=newJButton(nLoginn);
JButtoncancel=newJButton("Canceln);
p.add(login);
p.add(cancel);
getRootPane().setDefaultButton(login);
login.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventargO){
〃在login按钮执行的时候执行这个actionPerformed方法
〃这种在什么情况下执行一个方法的现象叫:事件方法
//System.out.println("Loginclick!");
〃调用控制器对象的login。方法,启动登录流程
//clientContext变量必须引用控制器对象
clientContext.login();〃口J,能发生空指针异常
)
});
cancel.addActionListener(newActionListenerQ{
publicvoidactionPerformed(ActionEventargO){
clientContext.exit(LoginFrame.this);
)
});
returnp;
privateJPanelcreateCenterPane(){
JPanelp=newJPanel(newBorderLayout());
p.setBorder(newEmptyBorder(8,8,8,8));
p.add(BorderLayout.NORTH,createldPwdPaneO);
〃重要!
message=newJLabel(',n,JLabeLCENTER);
p.add(BorderLayout.CENTER,message);
returnp;
)
privateJPanelcreateIdPwdPane(){
JPanelp=newJPanel(newGridLayout(2,1,6,6));
p.add(createIdPane());
p.add(createPwdPane());
returnp;
)
privateJPanelcreateIdPane(){
JPanelp=newJPanel(newBorderLayout());
p.add(BorderLayout.WEST,newJLabel(“编号:"));
JTextFieldidField=newJTextField();
//重要!
this.idField=idField;
p.add(BorderLayout.CENTER,idField);
returnp;
)
privateJPanelcreatePwdPane(){
JPanelp=newJPanel(newBorderLayout());
p.add(BorderLayout.WEST,newJLabel("密码:
JPasswordFieldpwdField=newJPasswordField();
〃重要!
this.pwdField=pwdField;
pwdField.enablelnputMethods(true);
p.add(BorderLayout.CENTER,pwdField);
returnp;
)
privateClientContextclientContext;
/**依赖注入(IOC),就是给变量赋值,使变量不再null*/
publicvoidsetClientContext(ClientContextclientContext){
this.clientContext=clientContext;
)
privateJTextFieldidField;
privateJPasswordFieldpwdField;
privateJLabelmessage;
publicintgetUserId(){
returnInteger.parseInt(idField.getText());
)
publicStringgetPwd(){
returnnewString(pwdField.getPassword());
)
/**在界面上显示一个消息,一般是错误消息*/
publicvoidshowMessage(Stringmsg){
Colorcol=Color.red;
finalPointlocation=this.getLocation();
message.setForeground(col);
message.setText(msg);
finalTimertimer=newTimer();
timer.schedule(newTimerTask(){
int[]off={0,0};
inti=0;
publicvoidrun(){
setLocation(location.x4-off[i++%off.length],
location.y);
)
},0,1000/20);
timer.schedule(newTimerTask(){
publicvoidrun(){
Colorcolor=message.getForeground();
inta=color.getAlpha();
a=a==0?0:(int)(a*80.0/100);
Colorc=newColor(color.getRed(),
color.getGreen(),color.getBlue(),a);
message.setForeground(c);
)
),2000,200);
timer.schedule(newTimerTask(){
publicvoidrun(){
message.setText(,H,);
timer.cancel();
setLocation(location);
)
),4000);
(1.2)主登陆界面:
图2主登陆界面
代码如下:
packagecom.tarena.elts.ui;
importjava.awt.BorderLayout;
importjava.awt.FlowLayout;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;
importjavax.swing.Imagelcon;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JPanel;
importcom.tarena.elts.entity.User;
*主菜单界面
*JPanel(BorderLayout)contentPane
*I—(北)JLabel(图片)
*1—(中)JPanel(BorderLayout)
*Il--(北)JLabeI(XXX同学…)
*I1—(中)JPanel(FlowLayout)
*II-[Button(开始)
*Il--JButton(分数)
*I"JButton(规则)
*Il-JButton(离开)
*I-(南)JLabel(版权信息)
*/
publicclassMenuFrameextendsJFrame{
publicMenuFrame(){
init();
)
privatevoidinit(){
setTitle("辽宁工程技术大学在线测评)
setSize(600,400);
setContentPane(createContentPane());
setLocationRelativeTo(null);
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
clientContext.exit(MenuFrame.this);
});
}
privateJPanelcreateContentPane(){
JPanelpane=newJPanel(newBorderLayout());
Imageiconicon=newImageIcon(
this.getClass().getResource("title.png"));
//MenuFrame.class.getResource(ntitle.pngn);
pane.add(BorderLayout.NORTH,newJLabel(icon));
pane.add(BorderLayout.CENTER,createMenuPane());
pane.add(BorderLayout.SOUTH,
newJLabel("辽宁工大-!!!”,
JLabel.RIGHT));
returnpane;
)
privateJPanelcreateMenuPane(){
JPanelpane=newJPanel(newBorderLayoutQ);
〃务必将info引用到界面控件对象
JLabelinfo=
newJLabel("XXX同学您好!",JLabel.CENTER);
〃重要!
this.userlnfo=info;
pane.add(BorderLayout.NORTH,info);
pane.add(BorderLayout.CENTER,createBtnPane());
returnpane;
)
privateJPanelcreateBtnPane(){
JPanelpane=newJPanel(newFlowLayout());
JButtonstart=createImgBtn("exam.png",”开始");
JButtonresult=createImgBtn(”result.png",“分数)
JButtonmsg=createImgBtn(”message.png”,”考试规则)
msg.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
Guizheguizhe=newGuizhe();
guizhe.setVisible(true);
//setVisible(false);
});
JButtonexit=createImgBtn("exit.png",”离开)
pane.add(start);
pane.add(result);
pane.add(msg);
pane.add(exit);
getRootPane().setDefaultButton(start);
start.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventargO){
clientContext.start();
)
});
result.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventargO){
clientContext.result();
)
});
exit.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventargO){
〃全限定名
com.tarena.elts.ui.MenuFrame.this.
clientContext.exit(
com.tarena.elts.ui.MenuFrame.this);
}
});
returnpane;
)
//创建图片按钮的方法
privateJButtoncreateImgBtn(
Stringimg,Stringtxt){
Imageiconico=newImagelcon(
this.getClass().getResource(img));
JButtonbutton=newJButton(txt,ico);
//button.setlcon(ico);
〃垂直文本对齐位置
button.setVerticalTextPosition(
JButton.BOTTOM);
//水平文本对齐位置
button.setHorizontalTextPosition(
JButton.CENTER);
returnbutton;
}
privateJLabeluserinfo;
publicvoidupdateView(Useruser){
Stringstr="欢迎n+user.getName()+”参加考试U
userlnfo.setText(str);
)
privateClientContextclientContext;
publicvoidsetClientContext(ClientContextclientContext){
this.clientContext=clientContext;
)
(1.3)考试界面:
图3考试界面
代码如下:
packagecom.tarena.elts.ui;
importjava.awt.BorderLayout;
importjava.awt.Color;
importjava.awt.FlowLayout;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;
importjava.util.ArrayList;
importjava.util.List;
importjavax.swing.Imagelcon;
importjavax.swing.JButton;
importjavax.swing.JCheckBox;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JPanel;
importjavax.swing.JScrollPane;
importjavax.swing.JlextArea;
importjavax.swing.border.EmptyBorder;
importjavax.swing.border.TitledBorder;
importcom.tarena.elts.entity.Examlnfo;
importcom.tarena.elts.entity.Questionlnfo;
/**
*考试界面
*
*JPanel(BorderLayout)
*1-(北)JLabel(图片)
*l--(中)JPanel(BorderLayout)
*I1-(北)JLabel(考试信息)
*Il--(中)JScorHPane
*III—JTextArea
*Il--(南)JPanel(FlowLayout)
*Il-JCheckBox(A)->0
*Il-JCheckBox(B)->1
*Il-JCheckBox(C)->2
*Il-JCheckBox(D)->3
*l--(南)JPanel(BorderLayout)
*1—(西)JLabel(题号)
*1—(中)JPaneI(FlowLayout)
*Il--JButton("上一题”)
*Il--JButton("下一题”)
*Il--JButton(“交卷”)
*I-(东)JLabel(时间)
*/
publicclassExamFrameextendsJFrame{
〃选项集合,方便答案读取的处理
privateOptionf]options=newOption[4];
publicExamFrameO{
init();
)
privatevoidinit(){
setTitle("i±内科技在线测评)
setSize(600,380);
setContentPane(createContentPane());
setLocationRelativeTo(null);
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
clientContext.sendQ;
)
});
)
privateJPanelcreateContentPane(){
JPanelpane=newJPanel(newBorderLayoutQ);
pane.setBorder(newEmptyBorder(6,6,6,6));
Imageiconicon=newImagelcon(
getClass().getResource("exam_title.pngn));
pane.add(BorderLayout.NORTH,
newJLabel(icon));
pane.add(BorderLayout.CENTER,
createCenterPane());
pane.add(BorderLayout.SOUTH,
createToolsPane());
returnpane;
)
privateJPanelcreateCenterPane(){
JPanelpane=newJPanel(newBorderLayoutO);
//注意!
JLabelexaminfo=
newJLabel("姓名:XXX考试:XXX考试时间:XXX”,
JLabeLCENTER);
//重要!
this.examlnfo=examinfo;
pane.add(BorderLayout.NORTH,examinfo);
pane.add(BorderLayout.CENTER,
createQuestionPane());
pane.add(BorderLayout.SOUTH,
createOptionsPane());
returnpane;
)
privateJPanelcreateOptionsPane(){
JPanelpane=newJPanel();
Optiona=newOption(0,MAH);
Optionb=newOption。JB");
Optionc=newOption(2,nC");
Optiond=newOption(3,nDn);
options[0]=a;
options[l]=b;
options[2]=c;
options[3]=d;
pane.add(a);
pane.add(b);
pane.add(c);
pane.add(d);
returnpane;
}
privateJScrollPanecreateQuestionPane(){
JScrollPanepane=newJScrollPane();
pane.setBorder(newTitledBorder(“题目"));〃标题框
//注意!
questionArea=newJlextArea();
questionArea.setText("问题\11人.\1止.”);
questionArea.setLineWrap(true);〃允许折行显示
questionArea.setEditable(false);//不能够编辑内容
//JTextArea必须放到JScrollPane的视图区域中(Viewport)
pane.getViewport().add(questionArea);
returnpane;
)
privateJPanelcreateToolsPane(){
JPanelpane=newJPanel(newBorderLayout());
pane.setBorder(newEmptyBorder(0,10,0,10));
//注意!
questionCount=
newJLabel("题目:20的1题)
timer=
newJLabel("剩余时间:222秒)
pane.add(BorderLayout.WEST,questionCount);
pane.add(BorderLayout.EAST,timer);
pane.add(BorderLayout.CENTER,createBtnPane());
returnpane;
)
privateJPanelcreateBtnPane(){
JPanelpane=newJPanel(newFlowLayout());
//重要!
prev=newJButton("上一题”);
next=newJButton("T一题)
JButtonsend=newJButton(“交卷”);
pane.add(prev);
pane.add(next);
pane.add(send);
next.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
clientContext.nextO;
)
});
prev.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
clientContext.prev();
)
));
send.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
clientContext.send();
}
});
returnpane;
)
/**使用内部类扩展了JCheckBox增加了value属性,代表答案值*/
classOptionextendsJCheckBox{
intvalue;
publicOption(intval,Stringtxt){
setText(txt);
this.value=val;
privateClientContextclientContext;
publicvoidsetClientContext(ClientContextclientContext){
this.clientContext=clientContext;
)
privateJLabelexaminfo;
privateJlextAreaquestionArea;
/**
*更新考试界面,显示试题和考试信息
*@paramexaminfo
*@paramquestioninfo
*/
publicvoidupdateView(ExamInfoexaminfo,
Questioninfoquestioninfo){
this.examlnfo.setText(examlnfo.toStringO);
questionArea.setText(questionlnfo.toStringO);
intcount=examInfo.getQuestionCount();
intindex=questioninfo.getQuestionIndex();
updateQuestionIndex(count,index);
updateButtons(count,index);
updateOptions(questionInfo.getUserAnswers());
}
privateJLabelquestionCount;
privatevoidupdateQuestionIndex(intcount,intindex){
Stringstr="题目:n+count+"的"+(index+l)+“题”;
questionCount.setlext(str);
/**更新选项框*/
privatevoidupdateOptions(List<Integer>userAnswers){
for(Optionopt:options){
opt.setSelected(userAnswers.contains(opt.value));
//if(userAnswers.contains(opt.value)){
//opt.setSelected(true);
//}else{
//opt.setSelected(false);
//)
)
)
privateJButtonnext;
privateJButtonprev;
/**更新按钮状态*/
privatevoidupdateButtons(intcount,intindex){
next.setEnabled(index!=count-l);
prev.setEnabled(index!=0);
//next.setEnabled(true);
//prev.setEnabled(true);
//if(index==0){
//prev.setEnabled(false);
//}
//if(index==count-1){
//next.setEnabled(false);
//}
//if(index==0){
//prev.setEnabled(false);
//}else{
//prev.setEnabled(true);
〃}
//if(index==count-1){
//next.setEnabled(false);
//}else{
//next.setEnabled(true);
//}
)
publicList<Integer>getUserAnswers(){
List<Integer>list=newArrayList<Integer>();
for(Optionoption:options){
if(option.isSelected()){
intval=option.value;
list.add(val);
)
}
returnlist;
)
privateJLabeltimer;
publicvoidshowTime(longh,longm,longs){
Stringstr=h+":"+m+n:M+s;
if(h=O&&m<5){
timer.setForeground(Col
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 河南省周口市项城市2024-2025学年高三下学期高考模拟一(开学诊断考试)数学试题(原卷版+解析版)
- 江苏省苏州市苏州工业园区星湾学校2024-2025学年下学期3月月考八年级数学试题(原卷版+解析版)
- 四川省资阳市安岳中学2025届高三下学期二模数学试题(原卷版+解析版)
- 《乡土中国》导读
- 2025年风力提水机组项目合作计划书
- 三方驾驶培训合作协议
- 售后变更通知函
- 长沙报关委托协议
- 汽车租赁合同范本大全
- 钢筋运输应急预案协议
- 中国国际航空内蒙古有限公司2025届空中乘务员航空安全员高校毕业生校园招聘笔试参考题库附带答案详解
- 2025江苏省安全员考试题库附答案
- 4.2 明确概念的方法 课件高中政治统编版选择性必修三逻辑与思维
- 2024年国网陕西省电力有限公司招聘笔试真题
- 2025年共同成立子公司的战略合作协议书
- 安保部绩效考核方案
- 2025年中国硫酸庆大霉素片行业市场深度分析及行业发展趋势报告
- 2025年江苏农林职业技术学院高职单招职业技能测试近5年常考版参考题库含答案解析
- 2025年背光源导光板市场分析现状
- 2025山东能源集团中级人才库选拔高频重点提升(共500题)附带答案详解
- 2025年度新股东增资扩股股权激励与员工持股计划协议3篇
评论
0/150
提交评论