JAVA网上辅助阅卷课程设计.doc_第1页
JAVA网上辅助阅卷课程设计.doc_第2页
JAVA网上辅助阅卷课程设计.doc_第3页
JAVA网上辅助阅卷课程设计.doc_第4页
JAVA网上辅助阅卷课程设计.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

淮 海 工 学 院 计算机工程学院课程设计报告设计名称: 面向对象课程设计 选题名称: 网上考试主观题辅助阅卷系统 姓 名: 赵友志 学 号: 111002137 专业班级: 网络工程 网络101 系 (院): 计算机工程学院 设计时间: 2012.6.112012.6.22 设计地点: 实验室、教室 成绩:指导教师评语: 签名: 年 月 日面向对象课程设计报告 第 22 页,共 22 页1课程设计目的面向对象程序设计是一门实践性很强的计算机专业基础课程,课程设计是学习完该课程后进行的一次较全面的综合练习。其目的在于通过实践加深学生对面向对象程序设计的理论、方法和基础知识的理解,掌握使用Java语言进行面向对象设计的基本方法,提高运用面向对象知识分析实际问题、解决实际问题的能力。2课程设计任务与要求:任务 可以对淮海工学院面向对象程序设计课程网上考试中改错题和编程题的答题结果进行辅助阅卷。学生的答题结果已经按各班级的层次结构进行保存。在以每个班级名称命名的文件夹下,分别有以学生学号和姓名命名的文件夹,在其下保留了学生的改错题和编程题的答题结果。要求:(1)、能够以树型目录的形式显示每个班级及每个学生的答题结果文件;(2)、点击学生答题结果文件,可以自动启动某个Java编辑器(如TextPad)打开Java源文件,供教师运行Java程序;(3)、教师可以根据学生的答题结果质量,给以评分,并把评分记录在一个表格中;(4)、整个表格中的数据可以写到Excel文件或数据库中进行保存。课程设计可选用NetBeans、Eclipse、JBuilder等作为开发平台以提高开发效率,尽可能熟练掌握其中一种集成开发环境。建议采用UML建模技术进行系统的分析设计,在Visio中画出系统用例图和类图,并将UML图复制到设计报告中。通过这次设计,要求掌握以下内容:面向对象技术中的继承与多态(重载和覆盖)机制、各种修饰符的使用类、包、接口的定义与使用常用工具类与算法的实现(数组、向量、字符串、链表)Java常用标准GUI组件及其事件处理Java的异常处理机制Java的数据库连接技术Java的多线程技术与动画制作Java的网络编程3课程设计说明书概要设计 功能实现(1)、学生文件夹只打开两层(空文件夹不加入),以班级为单位只加入根目录,目录下的JAVA文件。并以学生文件夹名作为枝结点名(包含学号和姓名信息)(2)、选中学生(枝结点)会将学号、班级、姓名信息自动加到表格,若不是第一次选中,则选中表格相应的学生行。(方便教师录入成绩)(3)、左击学生文件夹下的文件,将在文本区域中显示JAVA文件内容,供教师批改。右击文件则先编译JAVA源文件,源文件有错则用对话框显示相应出错信息,点确定后用TextPad打开源文件(源文件的打开进程用了waitFor()方法,只有关闭TextPad后才可继续用TextPad打开源文件),源文件没错则直接运行JAVA程序,再用TextPad打开供老师批改。(4)、选中成绩表相应行,学生树会自动滚到相应学生结点并将其打开。(5)、选择按学号排序后自动将成绩表按学号排序(方便教师查看是否缺少学生,或将学生有译的导出到Excel)(6)、点击保存结果后将成绩导出到Excel表中,供教师统计学生成绩(7)、清除按钮将清除批改成绩(所有学生成绩清零)(8)、重新打开一个班级后清空树和成绩表,并将新的学生数据加入到树中。 代码实现1、用文件过滤器设置只加入JAVA文件,以班级为单位,空文件夹不加入,同目录下只加入JAVA文件。2、为结点增加选择事件,设置节点展开或关闭之前鼠标的单击数为1次,用正则表达式得到树结点中学生学号、姓名和班级,(姓名的模式器(d9)(pPunct|s)*(u4e00-u9fa5+))用addRow()方法加到成绩表中。3、重写文件的toString方法(自定义结点文件类)设置结点的用户对象为文件,方便选中结点后读出结点内容。4、为学生成绩创建一个类,并将所有学生成绩加到一个Vector中,通过自定义比较器实现成绩表按学号排序。5、正则表达式得到学生学号,得到在学生向量中位置,remove掉表格监听器后用select方法选中成绩表中的相应行(得到的位置)。6、为编译和运行事件设置两个线程(防止exec产生的进程堵塞主线程),得到结点的用户对象(文件)后用javac命令编译,编译通过时启动运行线程。设置classpath后运行java源程序,再用TextPad打开文件;编译有错则用对话框显示出错信息后用TextPad打开文件,进程用waitFor()设置了等待,不关闭TextPad则无法继续打开。7、用一个TreePath变量保存上一次展开结点的path,在下一次展开其它结点时,用collapse(TreePath)收起结点实现每次只能展开一个枝结点。8、选中表格行时,得到上一次展开的TreePath,先用collapse()方法将其隐藏,再用startsWith()方法由学号得到对应的枝结点,expand(TreePath)将其展开,remove掉监听器后setSelectionPath(TreePath)将其选中。9、导入jxl.jar架包,将考试结果保存到Excel中。10、清空成绩时,先将学生向量中学生成绩设置为0,清空成绩表后将学生向量重新加入成绩表。学生类中增加了toTable()方法,返回一个vector,方便addRow(). 类代码public class NodeFile private File nodeFile;NodeFile(File f)nodeFile=f;public String toString()return nodeFile.getName();public File toFile()return nodeFile; public class StuGrade private String sname,sno,sclass;private int prom_score,error_score;StuGrade(String scs,String sna,String sn)sname=sna;sno=sn;sclass=scs;prom_score=0;error_score=0; public void setPromScore(int score)prom_score=score; public void setErrorScore(int score)error_score=score; public int getPromScore()return prom_score; public int getErrorScore()return error_score; public String getSno()return sno; SuppressWarnings(unchecked)public Vector toTable()Vector v=new Vector();v.add(sclass);v.add(sname);v.add(sno);v.add(error_score);v.add(prom_score);return v; 系统功能模块图详细设计Win.java/包括用户图形界面和树的选择事件处理import java.io.*;import java.util.*;import java.util.regex.*;import javax.swing.*;import javax.swing.event.*;import javax.swing.table.*;import javax.swing.tree.*;import java.awt.*;import java.awt.event.*;public class Win extends JFrame implements ActionListener,TreeSelectionListenerVector stuGrade;JButton openFolder;JFileChooser classFolder;File classFile=null;JTree stuTree;DefaultMutableTreeNode classRoot=null;JTextArea program_text;JTable gradeTable;GradeTable grade;static TreePath oldNodePath=null;int state;Win()super(java网络考试操作题问卷系统);stuGrade=new Vector();classFolder=new JFileChooser();classFolder.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);/只能选择文件夹classRoot=new DefaultMutableTreeNode(未选中考试文件夹);classRoot.add(new DefaultMutableTreeNode();program_text=new JTextArea(30,20);program_text.setEditable(false);program_text.setLineWrap(true);/设置是否换行program_text.setWrapStyleWord(true);/以单词为边界stuTree=new JTree(classRoot);stuTree.setShowsRootHandles(false);stuTree.addTreeSelectionListener(this);/为树增加监听器stuTree.addMouseListener(new RunSubject(stuTree);stuTree.setToggleClickCount(1);/打开枝结点的鼠标点击次数设为1grade=new GradeTable(stuTree,this,stuGrade);gradeTable=grade.toTable();JSplitPane splitOne=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,new JScrollPane(stuTree),new JScrollPane(program_text);JSplitPane splitTwo=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,splitOne,grade);openFolder=new JButton(打开考生文件夹);openFolder.addActionListener(this);add(openFolder,BorderLayout.NORTH);add(splitTwo,BorderLayout.CENTER);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);Toolkit tool=getToolkit();Dimension dim=tool.getScreenSize();setBounds(0,0,dim.width,dim.height);/全屏显示splitOne.setDividerLocation(dim.width/5);splitTwo.setDividerLocation(dim.width*2/3);splitOne.setDividerSize(4);splitTwo.setDividerSize(4);setVisible(true);validate();public void actionPerformed(ActionEvent e)if(e.getSource()=openFolder)state=classFolder.showOpenDialog(this);classFile=classFolder.getSelectedFile();if(state=JFileChooser.APPROVE_OPTION&classFile.exists()classRoot.removeAllChildren();/重新选择班级时,清空根结点、学生向量、学生成绩表stuGrade.clear();(DefaultTableModel)gradeTable.getModel().getDataVector().clear();oldNodePath=null;gradeTable.updateUI();gradeTable.getSelectionModel().removeListSelectionListener(grade);classRoot.setUserObject(new NodeFile(classFile);/将班级作为根结点File student=classFile.listFiles(),temp=null;/得到学生文件夹DefaultMutableTreeNode stuNode=null;for(File stu:student)stuNode=new DefaultMutableTreeNode(new NodeFile(stu);if(stu.isDirectory()/是目录的情况temp=stu.listFiles(new FilenameFilter()public boolean accept(File dir,String name)return name.endsWith(.java););/得到每个学生的答题结果文件(.java文件)if(temp.length!=0)for(File f:temp)stuNode.add(new DefaultMutableTreeNode(new NodeFile(f);/答题结果文件作为叶子结点classRoot.add(stuNode);else if(stu.getName().endsWith(.java)/只加入JAVA文件classRoot.add(stuNode);stuTree.updateUI();/刷新public void valueChanged(TreeSelectionEvent e) program_text.setText(null);boolean search=false;if(e.getSource()=stuTree&classFile!=null)DefaultMutableTreeNode subjectNode=(DefaultMutableTreeNode)stuTree.getLastSelectedPathComponent();if(subjectNode!=null&subjectNode.isLeaf()try File subject=(NodeFile)subjectNode.getUserObject().toFile();BufferedReader read=new BufferedReader(new FileReader(subject);String str=null;while(str=read.readLine()!=null)program_text.append(str+n);program_text.select(0, 0);/设置在文件开关read.close(); catch (IOException e1) e1.printStackTrace();else if(subjectNode!=null&!subjectNode.isRoot()/单击枝结点展开,并在表格中初始化数据if(oldNodePath!=null)stuTree.collapsePath(oldNodePath);/隐藏止一层子结点DefaultTableModel gradeModel=(DefaultTableModel)gradeTable.getModel();String sno=(NodeFile)subjectNode.getUserObject().toString(),sclass=null,sname=null;String regex=(d9)(pPunct|s)*(u4e00-u9fa5+);/得到学生姓名Pattern pattern=Ppile(regex);Matcher matcher=pattern.matcher(sno);StuGrade corStu=null;int index=0;if(matcher.find()for(StuGrade stu:stuGrade)/学生向量中是否已经存在该学生,不存在刚加到表格中,存在则选中学生成绩表格中对应的行if(stu.getSno().equals(matcher.group(1)search=true;break;index+;if(!search)sclass=classFile.getName();sname=matcher.group(3);sno=matcher.group(1);corStu=new StuGrade(sclass,sname,sno);stuGrade.add(corStu);/增加到学生向量gradeModel.addRow(corStu.toTable();/增加到成绩表中gradeTable.getSelectionModel().removeListSelectionListener(grade);gradeTable.setRowSelectionInterval(index,index);gradeTable.getSelectionModel().addListSelectionListener(grade);elseJOptionPane.showMessageDialog(this,学生文件夹命名错误,请手动增加!);oldNodePath=new TreePath(subjectNode.getPath();public static void main(String args) new Win();RunSubject.java/包括JAVA源程序的编译和运行,打开TextPad,输出错误结果等操作import java.awt.event.*;import javax.swing.*;import javax.swing.tree.*;import java.io.*;public class RunSubject extends MouseAdapter implements RunnableJTree stuTree;Thread compile_prom=null,run_prom=null;/防止堵塞主线程DefaultMutableTreeNode selectNode=null;File subjectFile=null;RunSubject(JTree tree)stuTree=tree;compile_prom=new Thread(this);run_prom=new Thread(this);public void mouseClicked(MouseEvent e)selectNode=(DefaultMutableTreeNode)stuTree.getLastSelectedPathComponent();if(selectNode!=null&e.getModifiers()=InputEvent.BUTTON3_MASK&selectNode.isLeaf()tryif(!compile_prom.isAlive()compile_prom=new Thread(this);compile_prom.start();catch(Exception ex)SuppressWarnings(null)public void run()if(Thread.currentThread()=compile_prom)Runtime complie=Runtime.getRuntime();try subjectFile=(NodeFile)selectNode.getUserObject().toFile();InputStream in=complie.exec(javac +subjectFile.toString().getErrorStream();/编译JAVA源文件,启动一个线程BufferedReader buff=new BufferedReader(new InputStreamReader(in);if(buff.read()=-1)/编译成功时启动运行线程if(!run_prom.isAlive()run_prom=new Thread(this);run_prom.start();elseStringBuffer sb=new StringBuffer();String s=null;while(s=buff.readLine()!=null)/编译错误输出 sb.append(s+n);JOptionPane.showMessageDialog(null, sb.toString(),学生代码有错,JOptionPane.ERROR_MESSAGE);buff.close();Process pro=Runtime.getRuntime().exec(D:TextPad 6New FolderTextPad.exe +subjectFile.toString();try pro.waitFor(); catch (InterruptedException e) e.printStackTrace();/等待运行结束 catch (IOException e1) e1.printStackTrace(); else if(Thread.currentThread()=run_prom)Runtime ex=Runtime.getRuntime();String path=subjectFile.getParent()+ +subjectFile.getName().replaceAll(.java,);try ex.exec(java -classpath +path); catch (IOException e) e.printStackTrace();GradeTable.java/成绩表的选择事件处理以及成绩表的相关操作import javax.swing.*;import javax.swing.tree.*;import javax.swing.event.*;import javax.swing.table.*;import java.awt.*;import java.awt.event.*;import java.io.File;import java.util.*;public class GradeTable extends JPanel implements ActionListener,ListSelectionListenerJButton save,clear,sort;JPanel btp;DefaultTableModel model;JTable gradeTable;JTree stuTree;Win moveListener;Vector stuGrade;SuppressWarnings(serial)GradeTable(JTree tree,Win w,Vector stuGrade)stuTree=tree;moveListener=w;this.stuGrade=stuGrade;String title=班级,姓名,学号,改错题得分,编程题得分;Objectstu=new Object05;model=new DefaultTableModel(stu,title)/重写方法,使成绩只能录入数字 public boolean isCellEditable(int row ,int column)/设置前三列列不可编辑if(column3)return false;else return true;public void setValueAt(Object value,int row,int column)if(column=3|column=4)Integer num=0;trynum=new Integer(Integer.parseInt(String)value);catch(NumberFormatException e)JOptionPane.showMessageDialog(null, 成绩只能输入数字!);return ;super.setValueAt(value,row,column);/调用超类方法设置成绩;gradeTable=new JTable(model);gradeTable.setAutoscrolls(true);gradeTable.getTableHeader().setReorderingAllowed(false);/设置列不可拖动gradeTable.getSelectionModel().addListSelectionListener(this);save=new JButton(保存考试结果);clear=new JButton(清空考试数据);sort=new JButton(按照学号排序);save.addActionListener(this);clear.addActionListener(this);sort.addActionListener(this);btp=new JPanel();btp.add(sort);btp.add(save);btp.add(clear);setLayout(new BorderLayout();add(new JScrollPane(gradeTable),BorderLayout.CENTER);add(btp,BorderLayout.SOUTH);public void actionPerformed(ActionEvent e)if(e.getSource()=sort)int row=0;for(StuGrade stu:stuGrade)/读出成绩stu.setErrorScore(Integer.parseInt(gradeTable.getValueAt(row, 3).toString();stu.setPromScore(Integer.parseInt(gradeTable.getValueAt(row, 4).toString();row+;Collections.sort(stuGrade, new Comparator()/学号排序public int compare(StuGrade stu1, StuGrade stu2) return Integer.parseInt(stu1.getSno()-Integer.parseInt(stu2.getSno(););model.getDataVector().clear();gradeTable.getSelectionModel().removeListSelectionListener(this);gradeTable.updateUI();for(StuGrade stu:stuGrade)model.addRow(stu.toTable();/增加学生到表格中else if(e.getSource()=save)/导出数据到EXCELDefaultMutableTreeNode classRoot=(DefaultMutableTreeNode)(stuTree.getModel().getRoot();String className=(NodeFile)classRoot.getUserObject().toString();/得到根结点名字JTableToExcel.export(new File(className+.xls), className+成绩表, 赵友志, gradeTable);else if(e.getSource()=clear)/清空所有成绩int index=0;for(StuGrade stu:stuGrade)stu.setErrorScore(0);stu.setPromScore(0);gradeTable.setValueAt(0, index, 3);gradeTable.setValueAt(0, index, 4); index+;gradeTable.updateUI();public void valueChanged(ListSelectionEvent e)if(Win.oldNodePath!=null)stuTree.collapsePath(Win.oldNodePath);stuTree.updateUI();int index=gradeTable.getSelectedRow();String sno=(String)gradeTable.getValueAt(index,2),stu;DefaultMutableTreeNode classRoot=(DefaultMutableTreeNode)(stuTree.getModel().getRoot();int count=classRoot.getChildCount();for(int i=0;icount;i+)DefaultMutableTreeNode node=(DefaultMutableTreeNode)classRoot.getChildAt(i);stu=(NodeFile)node.getUserObject().toString();if(stu.startsWith(sno)/找到相应的结点stuTree.removeTreeSelectionListener(moveListener);TreePath nodePath=new TreePath(node.getPath();stuTree.setSelectionPath(nodePath);/选中该结点stuTree.expandPath(nodePath);/展开该结点,对叶子结点无效stuTree.scrollPathToVisible(nodePath);/滚动到该结点stuTree.addTreeSelectionListener(moveListener);Win.oldNodePath=nodePath;break; public JTable toTable()return gradeTable; 4课程设计成果运行界面及测试结果程序主界面教师选择批改班级,打开学生文件夹,读出相应文件(只读JAVA)到结点选中学生结点,增加相应学生初始化信息到成绩表中,并选中行选择相应JAVA文件,文本域显示文件内容右击编译选中JAVA源文件,显示错误结果(点确定后打开TextPad)点确定后用TextPad打开有错文件,供教师批改打分(Process进程调用了waitFor()方法,此处必须改完关闭TextPad才可继续打开文件)若源文件没有错误,则将运行源文件后,用TextPad打开源文件成绩表前三列不可编辑,成绩只能录入数字成绩录入完毕点击按学号排序后自动更新表格点击保存考试结果成绩导出到Excel清空考试数据之后显示重新选择班级后,清空树和表格,等待重新录入5.课程设计心得到今天,课程设计几乎就结束了。在这将近二周的时间里,确实也收获了很多。从开始

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论