您好,欢迎来到步遥情感网。
搜索
您的当前位置:首页辽宁工程技术大学大学软件项目实训报告

辽宁工程技术大学大学软件项目实训报告

来源:步遥情感网


辽宁工程技术大学

大型软件项目实训报告

教学单位 软件学院 专 业 软件工程 班 级 软升本11-3班 学生姓名 姚 阔 学 号 1120980324 指导教师 李红霞

一、实训目的 通过外出实训提高自己的实战能力,对软件编程项目有更深刻的理解。根据企业对人才的具体需求,针对软件学院应届毕业生,开展以大型软件工程项目为目的的实战训练,有效提升学生的项目实战能力和适应市场的能力,最终实现学生比较理想的就业率和就业质量。 二、实训时间和地点 1.实训时间:2012年12月17~2013年1月25日 2.实训地点:辽宁省沈阳市达内职业培训学校 三、实训单位简介 沈阳达内科技有限公司是中国高端IT培训行业领导品牌,由美国国际数据集团IDGVC Partners和集富亚洲JAFCO ASIA投资,由来自SUN、IBM、亚信、华为、东软、用友等国际知名IT公司的技术骨干、海外留学生和加拿大专业技术人员创办,直接引进北美IT技术,结合中国IT企业的现状,定制化培养高端IT人才。 经过9年运营,沈阳达内科技有限公司在大学生IT就业培训领域积累了丰富的专业经验与就业资源,实现了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日期: date cal关机 poweroff windows:shutdown Reboot exit find grep find [目录列表] 匹配标准 -name size -type -atime 通配符: 操作目录下有需要通配的内容的时候采使用通配符。* ,[],?,!,{}; | 将上一个命令的输出作为下一个命令的输入: cat /etc/passwd | grep -n root tee ls -l | tee a.txt ln 硬连接 软连接 ln file02 file ln -s file02 sfile users: who: who am i: whoami: 系统进程信息 ps ps u:详细方式显示当前终端下的进程的信息 ps -e:当前正在运行的所有进程 sleep 10& kill PID jobs: 查看任务 kill %n fg %n bg %n stop %n ctrl+c / z man 帮助手册 (a) 系统命令 (b) 系统调用 open (c) 库函数 fopen (d) 管理员的命令 ifconfig service ifconfig ip地址:netmask: 默认网关: 域名解析 netstat ping ip export HOME: PWD: PATH: LANG: CC: CCC: PS1: PS2 export PS1=\"\" ~/.bashrc source ~/.bashrc xxx.sh #!/bin/bash cal date ls vi 命令模式: i a h j k l ctrl+b f shift+9 0 w e b $ 0 x 5x X 5X dd 5dd yw yy p r R u : undo #G 底行命令模式:set nu set cindent:按照C语言的风格进行自动缩进。 set tabstop=4:设置tab按键的长度 行号+回车 字符串n N /n个空格 %s/string/replace/g w filename #1,#2 w filename q q! wq gedit kate C程序的开发执行次序: (a) 写源文件,后缀名 .c (b)对代码中的指令进行预处理,以#开头的 (c) 代码编译,生成 xx.o/xx.obj (d)代码的连接生成可执行文件 a.out/xx.exe (e) 加载文件,把文件从硬盘读入内存 (f)执行 gcc 的选项: -c 只编译不连接 -E 只作预处理 -S 汇编代码 -std=c/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步:取出该数的奇数位和, c1 = 6 + 2 + 1 + 8 + 1 + 2 = 20 第2步:取出该数的偶数位和, c2 = 9 + 1 + 6 + 5 + 1 + 8 = 30 第3步:将\"奇数和\"与\"偶数和的三倍\"相加, cc = c1+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)String str=\"6921168511 2 8\"; 下标: 012345671011 0-----》6 1-----》9 2-----》2 str.charAt(i)//i指的下标,取出下标是i的单个字符 0 6 1 9 3) char--------》int ‘6’!=6 0~9在编码级是连续 ‘6’-‘0’ = 6 for2.demo4 4)do{ 循环体语句 }while(表达式) a 首先执行一次循环体语句,再来判断表达式是true 还是false,如果true,继续执行循环体,如果false 直接退出循环 b do{}while()不管表达式真还是假,都会执行 一次循环体 5)退出循环 a break:退出整个循环 b continue:退出本次循环 6)循环嵌套 //java基础难点:循环嵌套 ,冒泡排序,选择排序,插入排序 一个循环的内部又包含一个循环 2.2 数组 定义:一些相同类型的变量集合在了一起,就是数组,数组 大小必须固定 1)声明数组 数据类型[] 数组名字 / 数据类型 数组名字[] eg: int[] a; 2)数组初始化 a 静态初始化: int[] a = {1,2,5,123,78}; b 动态初始化: int[] ary = new int[5]; int[] ary = new int[]{56,78,90}; 3)访问数组 数组的下标:就是为了区分数组中的每个元素(变量) 下标: 数组的下标永远都从0开始 访问数组元素的格式: 数组名[下标值] 4) 数组的长度(数组中元素的个数) 数组名.length---------->当前数组中元素的个数 数组的第1个元素的下标:0 数组的最后1个元素的下标是:length-1 2.3 方法(函数):具有一定功能的代码块 public static void main(String[] args){} 1)格式 2)没有参数没有返回值的方法 输出一句话 调用方法: 方法名(); 3)没有参数有返回值的方法 如果一个方法有返回值的话,必须要指明该返回值的数据类型 修饰词 返回值类型 方法名(形式参数列表){ 方法体 return 返回值 修饰词 返回值类型 方法名(形式参数列表){ } void:没有任何的返回值 方法体 } 4)含有参数的方法(值传递) 5)java中栈的变量分布 java程序启动的时候,会在内存中开辟两个区域,其中一个 用来保存局部变量(基本数据类型/引用类型对象地址值), 整个区域我们叫做栈,用来保存引用类型对象,叫做堆。 栈:后进先出 2.4 数组中的一些常用的方法 arraycopy(ary1, 0, ary2, 0, ary1.length) copyOf(目标, 新数组的长度) 2.5 排序 1)冒泡排序 特点:永远把最大的数放在后面,i只是比较轮次, 每次比较都是两两比较([j]与[j+1]比较) 2)选择排序 特点:永远是把最小的数放在前面,每轮都把小的数放到 前面,而且是i和j比较 2.6常用工具的方法 1)Random:随机 2)时间问题 3)针对数组最好的排序方法 2.7 双色球 1)案例 :实现随机生成双色球号码 ** 实现随机生成双色球号码: [02 22 13 16 18 12] [ 12 ] 红球 33 个球 (01~33) 取六个 蓝球 16 个球 (01~16) 取一个 提示: 01 01 0 true false ... 0 红球池 {\"01\ 蓝球池 {\"01\ 使用标记{ f, f, f, f, ... f} 结果采用一个数组存储, 数组可以利用数组扩容追加新的 “球号”,处理逻辑参考如下过程: a. 随机生成红球序号 b. 检查\"红球序号\"是否使用过(取出过) ,如果使用过返回 第1步 c. 取出一个红球, 设置使用标记为true d. 判断是否取出了6个红球,如果没有到6个, 返回第1步 e. 对红球结果排序 f. 取出一个篮球放入结果中 g. 输出结果6+1(红+兰) (3) 面向对象概念 3.1 Object----->东西 ,Java程序员:想着对象写代码 class 类名{ 属性 构造方法 方法 } 类: 事物的类型, 人类, 车类 类名 :对象名 = new 构造方法; 对象:事物的实例, 刘诗诗 ,门口刘老师的那辆28自行车 面向对象三大特征:封装 ,多态,继承,(抽象) 封装:对数据对代码尽可能不让外界看到 多态:事物在不同的情况下有不同的表现 花 --->花朵,花钱,花心 美女--->凤姐,刘诗诗,高圆圆,班主任 继承:代码的重复利用 3.2 类: 定义:代表一类事物. Eg: 人类 类: 特征 ------>基本属性 行为 ------>活动 3.3 java中的类: 特征 ------->属性------->变量 行为 ------->方法 class 类名{ 属性 方法 } 3.4 对象: 1)类跟对象之间的关系: 类是一类事物,类就是一个模板.eg:人类 对象是一个事物的实例 . eg:刘英谦 2)java开发的特点: a)设计类-------------------模板 b)实例化-------------------实现 3)声明/创建对象(实例化): 声明: 类名 对象名; 创建:对象名=new 构造方法; 4)对对象属性和方法的访问: 对象名.属性名 对象名.方法名 5)引用类型的变量值: 引用类型的变量值:堆当中对象的地址的值,是通过引用类型 的变量来找到堆中的对象 3.5 设计一个长方体类(Box): 属性:长,宽,高 方法:求体积(长*宽*高) 创建一个长方体的对象,给长宽高分别赋值,最后求该 长方体对象的体积。 3.6 构造方法: (方便我们创建对象) 1)构造方法在new的时候,自动调用的(给属性赋值) 2)构造方法没有返回值类型 3)构造方法的名字跟类名一样 4)this:指示代词,指代---当前(对象),构造方法当中参数,按照企业开发的规范,参数的名字, 必须跟属性名保持一致,通过this来区分属性名和参数名 this.属性:当前对象的属性 class Box{ } 5) 构造方法重载(构造方法的参数不同,方法名相同): 当new对象的时候,根据参数的不同,来调用不同的 构造方法 6) 使用this()去调用一个类中其他构造方法: this(参数):参数要跟调用的构造方法中的参数保持一致 int l; public Box(int l) { } this.l = l; (4) JavaBean规范 4.1 javaBean不是sun语法规定,是企业开发中约定俗成.为了,使用方便. 原因:一般企业开发的时候,属性一般都是定义为私有,通过方法来简介访问 1)属性私有(尽可能) 2)一定要有空参的构造方法 3)javaBean一定要放到一个包内 4)为私有的属性,提供get/set方法 5)要实现序列化接口 4.2 static :静态 修饰: 方法,属性,代码块,内部类 含义:static修饰任何部分(方法,属性,代码块,内部类), 该部分只跟类有关,跟对象无关 1) 静态属性: static修饰属性 该属性跟对象无关,跟类有关,而且所有的对象都可以去。 访问静态属性: 定义的格式: static 数据类型 变量名。 访问的方式: 类名.属性名。 案例:统计一个班级的学生人数 分析: class Student{ } 总结:静态变量是在堆单独开辟一块内存区域,用 类名.静态变量名来访问,静态变量只跟类有关,跟对象无关。 实例变量:跟对象有关,是属于这个对象的, 但是可以通过对象.静态变量名来访问静态变量。 2) 代码块: 在一个类里面,用{代码},就是代码块,每次实例化的时候,都会执行一次,企业开发中现在已经很少很少很少使用,功能很像构造方法。 3) 静态代码块: 用static修饰一个代码块,static{代码块},创建对象(类加载) 只执行一次。 4) 静态方法: 用static修饰的方法,叫做静态方法,静态方法是类的方法。 调用方法:类名.方法名。 强调:静态不能调用实例变量。 静态方法:经常作为工具方法。 4.3 final: 最终的final可以修饰属性,方法,类。 String name;//实例变量 static int count;//静态变量 public Student(String name){ } this.name = name; count++; 1) final来修饰类: 用final修饰的类,都不用使用子类去继承,sun提供的工具类很多都是final类型的,eg String。 总结:企业开发中,尽量不要使用final来修饰我们自己的类, struts2.x/struts1.x , hibernate , spring,基于。 反射实现,内部会频繁使用动态代理技术(jdk/cglib) 2) final修饰方法: 用final修饰的方法,不能让子类再去重写该方法。 3) final修饰变量: a 用final修饰局部变量。 b 用final修饰形式参数。 c 用final对象。 4) java中常量的表达方法: final static 数据类型 变量名 = 值; java中常量一定是所有字母全部大写(一般), 常量一定要放到类当中,不要放到main方法,因为常量是经常需要使用的。 4.4 抽象类: 不是一个具体类,有些方法没有实现,需要靠子类继承,这个抽象类来实现其方法。 1)抽象类有未实现的方法,需要靠子类继承这个抽象 类来实现其方法。 2)抽象类不能实例化,因为有未实现的抽象方法。 3) 抽象类跟一般类只有一个区别,就是多了一个抽象 方法。 4)抽象类适合作为系统的分析和设计的工具。 5)判断题:含有抽象方法的类就是抽象类。 6)可以使用父类声明执行子类对象去实例化 格式: 抽象类 对象名 = new 子类构造方法 7)案例: 设计车(抽象类) 属性: name ,color, speed,money 方法: 启动,刹车,运行 --》均没有实现 Taxi(子类继承抽象类) 方法:全部实现(方法重写) 2.实训期间完成的实践项目 我在达内老师的带领下,学习了java基础之后,做了一个在线考试系统,虽然程序比较简略,但是基本功能已经实现。 (1)功能介绍 (1.1)用户登录: 程序首页在用户第一次访问时会判断用户是否登录,未登录则显示用户登录窗口,提示用户登录或注册.对于已经登录的用户,在用户登录窗口将显示用户的相关信息. 图1 登录界面 代码如下: package com.tarena.elts.ui;//User Interface 用户界面包 import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.util.Timer; import java.util.TimerTask; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTextField; import javax.swing.border.EmptyBorder; /** * 登陆界面 是一个具体的窗口框 * 布局规划: * JPanel(BorderLayout) contentPane * |--(北) JLabel(\"登陆系统\") * |--(中) JPanel(BorderLayout) centerPane * | |--(北)JPanel(GridLayout(2行,1列)) * | |--JPanel(BorderLayout) * | | |--(西)JLable(编号:) * | | |--(中)JTextField() * | |--JPanel(BorderLayout) * | |--(西)JLable(密码:) * | |--(中)JPasswordField * |--(南) JPanel (FlowLayout) * |--JButton(\"Login\") * |--JButton(\"Cancel\") */ public class LoginFrame extends JFrame { public LoginFrame() { } private void init(){//初始化方法 setTitle(\"登陆\"); this.setSize(300, 220); setLocationRelativeTo(null);//居中 add(createContentPane()); //super(\"登陆\");// new JFrame(String) init(); setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); //setContentPane(createContentPane()); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { } }); } private JPanel createContentPane(){//创建内容面板 JPanel p = new JPanel(new BorderLayout()); p.setBorder(new EmptyBorder(10,10,10,10)); p.add(BorderLayout.NORTH, new JLabel(\"登陆系统\clientContext.exit(LoginFrame.this); p.add(BorderLayout.CENTER, createCenterPane()); } p.add(BorderLayout.SOUTH, createBottomPane()); return p; private JPanel createBottomPane(){ JPanel p = new JPanel(new FlowLayout()); JButton login = new JButton(\"Login\"); JButton cancel = new JButton(\"Cancel\"); p.add(login); p.add(cancel); getRootPane().setDefaultButton(login); login.addActionListener(new ActionListener() { }); cancel.addActionListener(new ActionListener() { }); return p; public void actionPerformed(ActionEvent arg0) { } clientContext.exit(LoginFrame.this); public void actionPerformed(ActionEvent arg0) { } //在login按钮执行的时候执行这个actionPerformed方法 //这种在什么情况下执行一个方法的现象叫: 事件方法 //System.out.println(\"Login click!\"); //调用控制器对象的login()方法, 启动登录流程 //clientContext变量必须引用控制器对象 clientContext.login();//可能发生空指针异常 } private JPanel createCenterPane(){ JPanel p = new JPanel(new BorderLayout()); p.setBorder(new EmptyBorder(8,8,8,8)); p.add(BorderLayout.NORTH, createIdPwdPane()); //重要! message = new JLabel(\"\p.add(BorderLayout.CENTER, message); return p; } private JPanel createIdPwdPane(){ } private JPanel createIdPane(){ } private JPanel createPwdPane(){ JPanel p = new JPanel(new BorderLayout()); p.add(BorderLayout.WEST, new JLabel(\"密码:\")); JPanel p = new JPanel(new BorderLayout()); p.add(BorderLayout.WEST, new JLabel(\"编号:\")); JTextField idField = new JTextField(); // 重要! this.idField = idField; p.add(BorderLayout.CENTER, idField); return p; JPanel p = new JPanel(new GridLayout(2, 1, 6, 6)); p.add(createIdPane()); p.add(createPwdPane()); return p; } JPasswordField pwdField = new JPasswordField(); //重要! this.pwdField = pwdField; pwdField.enableInputMethods(true); p.add(BorderLayout.CENTER, pwdField); return p; private ClientContext clientContext; /** 依赖注入(IOC),就是给变量赋值, 使变量不再null */ public void setClientContext(ClientContext clientContext) { } private JTextField idField; private JPasswordField pwdField; private JLabel message; public int getUserId(){ } public String getPwd(){ } /** 在界面上显示一个消息, 一般是错误消息 */ public void showMessage(String msg){ Color col = Color.red; final Point location = this.getLocation(); message.setForeground(col); message.setText(msg); final Timer timer = new Timer(); timer.schedule(new TimerTask() { return new String(pwdField.getPassword()); return Integer.parseInt(idField.getText()); this.clientContext = clientContext; } } int[] off = {0,0}; int i = 0; public void run() { } setLocation(location.x +off[i++%off.length], location.y); }, 0, 1000/20); timer.schedule(new TimerTask() { public void run() { } Color color = message.getForeground(); int a = color.getAlpha(); a = a == 0 ? 0 : (int)(a * 80.0/100); Color c = new Color(color.getRed(), color.getGreen(), color.getBlue(), a); message.setForeground(c); }, 2000, 200); timer.schedule(new TimerTask() { public void run() { } message.setText(\"\"); timer.cancel(); setLocation(location); },4000); (1.2)主登陆界面: 图2 主登陆界面 代码如下: package com.tarena.elts.ui; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import com.tarena.elts.entity.User; /** * 主菜单界面 * JPanel(BorderLayout) contentPane * |--(北)JLabel(图片) * |--(中)JPanel(BorderLayout) * | |--(北)JLabel(XXX同学...) * | |--(中)JPanel(FlowLayout) * | |--JButton(开始) * | |--JButton(分数) * | |--JButton(规则) * | |--JButton(离开) * |--(南)JLabel(版权信息) */ public class MenuFrame extends JFrame { public MenuFrame() { init(); } private void init(){ setTitle(\"辽宁工程技术大学在线测评\"); setSize(600,400); setContentPane(createContentPane()); setLocationRelativeTo(null); setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { } }); clientContext.exit(MenuFrame.this); } private JPanel createContentPane(){ JPanel pane = new JPanel(new BorderLayout()); ImageIcon icon = new ImageIcon( this.getClass().getResource(\"title.png\")); //MenuFrame.class.getResource(\"title.png\"); pane.add(BorderLayout.NORTH,new JLabel(icon)); pane.add(BorderLayout.CENTER,createMenuPane()); pane.add(BorderLayout.SOUTH, new JLabel(\"辽宁工大--版权所有 盗版必杀!!!\ JLabel.RIGHT )); return pane; } private JPanel createMenuPane(){ JPanel pane = new JPanel(new BorderLayout()); //务必将info 引用到界面控件对象 JLabel info = new JLabel(\"XXX 同学您好!\ //重要! this.userInfo = info; pane.add(BorderLayout.NORTH, info); pane.add(BorderLayout.CENTER,createBtnPane()); return pane; } private JPanel createBtnPane(){ JPanel pane = new JPanel(new FlowLayout()); JButton start = createImgBtn(\"exam.png\开始\"); JButton result = createImgBtn(\"result.png\分数\"); JButton msg = createImgBtn(\"message.png\考试规则\"); msg.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { } Guizhe guizhe=new Guizhe(); guizhe.setVisible(true); setVisible(false); // }); JButton exit = createImgBtn(\"exit.png\离开\"); pane.add(start); pane.add(result); pane.add(msg); pane.add(exit); getRootPane().setDefaultButton(start); start.addActionListener(new ActionListener() { }); public void actionPerformed(ActionEvent arg0) { } clientContext.start(); result.addActionListener(new ActionListener() { }); public void actionPerformed(ActionEvent arg0) { } clientContext.result(); exit.addActionListener(new ActionListener() { }); public void actionPerformed(ActionEvent arg0) { } //全限定名 com.tarena.elts.ui.MenuFrame.this. clientContext.exit( com.tarena.elts.ui.MenuFrame.this); return pane; } // 创建图片按钮的方法 private JButton createImgBtn( String img, String txt) { ImageIcon ico = new ImageIcon( this.getClass().getResource(img)); JButton button = new JButton(txt, ico); //button.setIcon(ico); //垂直文本对齐位置 button.setVerticalTextPosition( JButton.BOTTOM); // 水平文本对齐位置 button.setHorizontalTextPosition( JButton.CENTER); return button; } private JLabel userInfo; public void updateView(User user){ String str = \"欢迎 \"+user.getName() +\" 参加考试!\"; userInfo.setText(str); } private ClientContext clientContext; public void setClientContext(ClientContext clientContext) { } } this.clientContext = clientContext; (1.3)考试界面: 图3 考试界面 代码如下: package com.tarena.elts.ui; import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import java.util.List; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.border.EmptyBorder; import javax.swing.border.TitledBorder; import com.tarena.elts.entity.ExamInfo; import com.tarena.elts.entity.QuestionInfo; /** * 考试界面 * * JPanel(BorderLayout) * |--(北)JLabel(图片) * |--(中)JPanel(BorderLayout) * | |--(北)JLabel(考试信息) * | |--(中)JScorllPane * | | |-- JTextArea * | |--(南)JPanel(FlowLayout) * | |--JCheckBox(A) -> 0 * | |--JCheckBox(B) -> 1 * | |--JCheckBox(C) -> 2 * | |--JCheckBox(D) -> 3 * |--(南)JPanel(BorderLayout) * |--(西)JLabel(题号) * |--(中)JPanel(FlowLayout) * | |--JButton(\"上一题\") * | |--JButton(\"下一题\") * | |--JButton(\"交卷\") * |--(东)JLabel(时间) */ public class ExamFrame extends JFrame{ //选项集合, 方便答案读取的处理 private Option[] options = new Option[4]; public ExamFrame() { init(); } private void init(){ setTitle(\"达内科技在线测评\"); setSize(600,380); setContentPane(createContentPane()); setLocationRelativeTo(null); setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { } clientContext.send(); }); } private JPanel createContentPane(){ JPanel pane = new JPanel(new BorderLayout()); pane.setBorder(new EmptyBorder(6,6,6,6)); ImageIcon icon = new ImageIcon( getClass().getResource(\"exam_title.png\")); pane.add(BorderLayout.NORTH, new JLabel(icon)); pane.add(BorderLayout.CENTER, createCenterPane()); pane.add(BorderLayout.SOUTH, createToolsPane()); return pane; } private JPanel createCenterPane() { JPanel pane = new JPanel(new BorderLayout()); // 注意! JLabel examInfo = new JLabel(\"姓名:XXX 考试:XXX 考试时间:XXX\ JLabel.CENTER); // 重要! this.examInfo = examInfo; pane.add(BorderLayout.NORTH, examInfo); pane.add(BorderLayout.CENTER, createQuestionPane()); pane.add(BorderLayout.SOUTH, createOptionsPane()); return pane; } private JPanel createOptionsPane(){ JPanel pane = new JPanel(); Option a = new Option(0,\"A\"); Option b = new Option(1,\"B\"); Option c = new Option(2,\"C\"); Option d = new Option(3,\"D\"); options[0]=a; options[1]=b; options[2]=c; options[3]=d; pane.add(a); pane.add(b); pane.add(c); pane.add(d); return pane; } private JScrollPane createQuestionPane() { JScrollPane pane = new JScrollPane(); pane.setBorder(new TitledBorder(\"题目\"));//标题框 //注意! questionArea = new JTextArea(); questionArea.setText(\"问题\\nA.\\nB.\"); questionArea.setLineWrap(true);//允许折行显示 questionArea.setEditable(false);//不能够编辑内容 //JTextArea 必须放到 JScrollPane 的视图区域中(Viewport) pane.getViewport().add(questionArea); return pane; } private JPanel createToolsPane() { JPanel pane = new JPanel(new BorderLayout()); pane.setBorder(new EmptyBorder(0,10,0,10)); // 注意! questionCount = new JLabel(\"题目:20 的 1题\"); timer = new JLabel(\"剩余时间:222秒\"); pane.add(BorderLayout.WEST, questionCount ); pane.add(BorderLayout.EAST, timer ); pane.add(BorderLayout.CENTER, createBtnPane()); return pane; } private JPanel createBtnPane() { JPanel pane = new JPanel(new FlowLayout()); // 重要! prev = new JButton(\"上一题\"); next = new JButton(\"下一题\"); JButton send = new JButton(\"交卷\"); pane.add(prev); pane.add(next); pane.add(send); next.addActionListener(new ActionListener() { }); public void actionPerformed(ActionEvent e) { } clientContext.next(); prev.addActionListener(new ActionListener() { }); public void actionPerformed(ActionEvent e) { } clientContext.prev(); send.addActionListener(new ActionListener() { }); public void actionPerformed(ActionEvent e) { } clientContext.send(); return pane; } /** 使用内部类扩展了 JCheckBox 增加了value 属性, 代表答案值*/ class Option extends JCheckBox{ int value; public Option(int val, String txt) { setText(txt); this.value = val; } } private ClientContext clientContext; public void setClientContext(ClientContext clientContext) { } this.clientContext = clientContext; private JLabel examInfo; private JTextArea questionArea; /** * 更新考试界面, 显示试题和考试信息 * @param examInfo * @param questionInfo */ public void updateView(ExamInfo examInfo, QuestionInfo questionInfo){ this.examInfo.setText(examInfo.toString()); questionArea.setText(questionInfo.toString()); int count = examInfo.getQuestionCount(); int index = questionInfo.getQuestionIndex(); updateQuestionIndex(count, index); updateButtons(count, index); updateOptions(questionInfo.getUserAnswers()); } private JLabel questionCount; private void updateQuestionIndex(int count, int index) { String str = \"题目:\"+count + \" 的 \" + (index+1)+\"题\"; questionCount.setText(str); } /** 更新选项框 */ private void updateOptions(List userAnswers) { for (Option opt : options) { // // // // // } private JButton next; opt.setSelected(userAnswers.contains(opt.value)); } if(userAnswers.contains(opt.value)){ opt.setSelected(true); }else{ } opt.setSelected(false); private JButton prev; /** 更新按钮状态 */ private void updateButtons(int count, int index) { next.setEnabled(index!=count-1); prev.setEnabled(index!=0); // // // // // // // // // if(index==0){ next.setEnabled(true); prev.setEnabled(true); if(index==0){ } if(index==count-1){ } next.setEnabled(false); prev.setEnabled(false); // // // // // // // // // } prev.setEnabled(false); }else{ } if(index==count-1){ next.setEnabled(false); prev.setEnabled(true); }else{ } next.setEnabled(true); public List getUserAnswers(){ List list = new ArrayList(); for (Option option : options) { } if(option.isSelected()){ } int val = option.value; list.add(val); return list; } private JLabel timer; public void showTime(long h, long m, long s) { } String str = h+\":\"+m+\":\"+s; if(h==0 && m<5){ } timer.setText(str); timer.setForeground(Color.red); } 五、实训收获与体会 时间过得很快,为期6周的实训即将接近尾声。在这6周中,每天都过得很充 实,从项目需求分析,调研,进度计划的制定到UI,数据库,架构设计,然后到编码实现,进度跟踪,每个阶段的评审报告,通过规范的软件开发流程让我收益匪浅。与以前的个人开发,想到什么做什么改变很大,也让我对软件工程这门课程有了更深的理解。我们组做的系统:远程实验室管理系统,由2组合作进行。我们主要做B/S端功能的实现,通过对HTML+CSS以及SSH框架学习,对SSH框架的环境搭建,开发流程,项目部署有了基本的了解。而且通过这个比较由难度的项目还了解了IE下远程桌面连接控件,MINA通信框架,这些都比较由意思,开拓了视野。 本人在小组担任项目经理,对项目管理有了一些切身的体会,例如人员分工,如何调动每个人的积极性,让合适的人做适合的事,都是一些需要考虑周全的事。项目计划的制定,需求实现的讨论例会等看似比较繁琐的事其实在项目中起到比较重要的作用。在项目中必须以身作则,带动大家一起参与到项目中来,让项目有条不紊的进行,更让我意识到一个团队最重要的就是队员间的合作。要做一个庞大的项目不能光靠一两个人,需要每个人都去认真对待并完成分配的任务。就像一台大型的机器,发动机是核心但也需每个小零部件的配合才能运转。更让我体会到一个完整项目的开发它所要经历的阶段包括:规划和用例说明、项目结构和风险评估、业务功能说明书、详细设计说明书、代码实现、测试、操作手册。一个项目的开发所需要的财力、人力都是大量的,如果没有一个好的远景规划,对以后的开发进度会产生很大的影响,严重时导致在预定时间内不能完成该项目或者完成的项目跟原先划所要实现的项目功能不符合。一份好的项目结构、业务功能和详细设计说明书对一个项目的开发有明确的指引作用,它可以使开发人员对这个项目所要实现的功能在总体上有具体的认识,并能减少在开发过程中出现不必要的脱节。代码的实现是一个项目开发成功与否的关键,可以说,前面所做的事情就是为代码的实现做铺垫。 JAVA项目开始有很大的难度,由于没有任何java基础,开始学习后也并非是想象中那样顺利,开始的学习让我异常感到学习任务的艰巨,因为学习中我们遇到了很多以前未曾遇到的难点,有时难免冥思苦想也无济于事,通过我们小组的积极努力协作,同时请教老师和其他同学,我们顺利的化解了一道道的障碍。这让我不断的对学习技术又有了新的认识,学习中我们必须边总结边学习,开始阶段对老师交代的任何方法和类都不要放过,不管是否简单与否都要乐于地接受,因为老师肯定有他的道理,相信老师走过的路比我们长,那么其经验也就肯定比我们丰富。 上课时一定要专心听讲,一个关键的知识点听漏了,可能会使一个人在课下花很多时间去消化,这样也就会花掉做其他事情的大量时间,同时也使得学习不能和老师的讲的课程同步,以至出现以后就跟不上老师讲课的进度而掉队。所以学习中我们宁可先劳其筋骨,苦其心志,饿其体肤,也不能掉队跟不上学习进度。 我克服了Java学 习上的一道道难关,课上认真听讲,摘好必要的笔记,并通过自己课后的不断消化 学习,现在自己已经基本掌握了一定的java的基础知识,并且能应用到相应的项目 开发中对项目开发的一些相关文档也有了一定的了解,能顺利实现项目的需求。 还有一点关于代码学习的体会,通过看人家的代码能够加快自己的学习。这个 方法对有经验的人来讲是对的,但是对于还在学习期间,没有经验的学员来讲,就 是一个认识 的误区了。因为你也许能看懂代码的语法,但根本看不懂代码背后的含 义,看不懂代码的设计,看不懂为什么要这么实现,看不懂代码所体现的思想,其 实,看了跟没看没有多大区别。 六、致谢 通过本次项目实训我要感谢学校领导给我们提供了这次机会,让我们自己有出去体会生活,自己做项目的深刻体会。这次实训让我明白我自己之前的学习还是差很多,只有不断的努力,才能学好。还要感谢达内公司对我的指导,我自己的努力固然重要,但是达内的优秀教师给我做的培训,讲的理论都让我受益匪浅,让我对软件有了一个新的概念新的理解。 指 导 教 师 意 见 指导教师签字: 年 月 日 成绩 备注

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- obuygou.com 版权所有 赣ICP备2024042798号-5

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务