1、 徐州工程学院综 合 训 练 报 告课 程 名 称 面向对象程序设计综合设计专 业 计算机科学与技术(单) 班 级 09 计单 学 生 姓 名 黄晨 学 号 2009*44 设 计 题 目 打字速度测试程序 指 导 教 师 * 设计起止时间:2011 年 12 月 21 日至 2012 年 1 月 6 日成绩- 1 -目录1 开发背景和意义 21.1 开发背景 .21.2 设计目的及意义 .22 需求分析 22.1 系统所需完成的任务 .22.2 系统功能需求分析 .33 总体设计 33.1 系统设计目标 .33.2 系统体系结构 .33.3 程序结构设计 .44 详细设计 54.1 起始界面
2、设计 .54.2 添加文件界面设计 .74.3 设置测试时间设计 .84.4 速度和剩余时间设计 .94.5 显示测试成绩设计 .105 系统测试 115.1 系统测试的方法 .115.2 程序测试 .116 设计总结 11参考文献 12附录 12- 2 -1 开发背景和意义1.1 开发背景二十世纪的后半期,尤其是 90 年代后,计算机取得了飞速的发展。近来,随着网络的发展,计算机已经成为人们生活中不可缺少的一部分。提高人们对计算机的操作能力显得尤为重要。而打字速度是衡量一个人操作熟练的一个重要方面。因此开发一种高效的打字程序显得迫在眉睫。目前大多数打字程序都是只能在 Windows 下运行,
3、跨平台运行能力不是很强。为了适应当下的需求,格外需要一款能够新的打字程序。本程序使用的开发工具是 java1.6,它目前是比较流行的 java 语言开发工具,在执行效率方面表现良好,在跨平台方面更是强项。因此用户可以放心使用。1.2 设计目的及意义随着科学技术的不断提高,计算机科学目渐成熟,计算机怩深入到工作和生活的各个角落,文字录入是学习计算机非常重要的一部分。在手写录入技术和语音识别技术还不完善的同时大部分人还在使用键盘作为文字录入的工具。所以我编了这样一个小程序,同时也是我的面向对象程序设计的课程设计。希望能对电脑初学都和想提高打字速度的朋友们有所帮助。本系统构建学生打字练习系统,基于所
4、开发的打字程序界面友好,图形复杂。打字练习程序中应用到 eclipse 最新版本,java1.6 以上版本的 jdk。对于打字测试进入整体的部署。完成打字练习程序开发,培养程序设计和开发能力。2 需求分析2.1 系统所需完成的任务打字速度测试程序。要求设计一款打字速度测试程序,要求界面良好,实现从磁盘上寻找打开一个文件、设置打字时间、时实显示打字速度和剩余时间等功能,应用到 GUI,多线程,文件的输入输出等知识。需要从磁盘打开要录入文件的样本,录入前可以设定录入练习时间,录入时需要实时显示录入速度和剩余时间,录入结束后,显示录入速度和错误率。录入结束方式可以通过点击“结束测试”按钮结束测试,文
5、章录入完成也自动结束录入,到达设置时间也自动结束录入。最后要求图形界面,界面良好美观。根据任务要求主要遇到的问题在于如何很好的监听按键菜单事件,监听部分键盘如(ctrl+o 和 enter) ;如何在打开文件对话框中过滤只显示 txt 和目录文件,读取文件后如何一部一部地显示并能正确统计录入字数和错误字数;如何在录入文章时,同时监控系统- 3 -时间,并能尽量减少 cpu 占用。2.2 系统功能需要分析经过对现有一般打字程序的使用者的调查与分析,得出若要编写此打字程序,本程序必需主要实现的管理功能如下:1.添加文件。从磁盘添加现有的文本文件显示在程序界面上方。2.设置测试时间。在打字开始前,可
6、以设置测试时间,方便快捷地结束测试。3.显示测试结果。结果主要包括:打字速度和错误率。4.在录入过程中,显示当前速度和剩余时间。为了时实提醒用户打字速度和打字时间必需可以时实提示打字速度和剩余时间(剩余时间是设置的测试时间减掉已使用的时间) 。5.使用菜单栏。要求菜单栏可以从“文件打开”添加文件,可以从“文件退出”退出程序,可以从“帮助关于”了解程序信息。6.多情况结束测试。1、当测试结束时,结束测试。2、当点击“结束测试”按钮结束测试。3、当文章录入完成结束测试。3 总体设计3.1 系统设计目标从磁盘添加现有的文本文件显示在程序界面上方。在打字开始前,可以设置测试时间,方便快捷地结束测试。显
7、示测试结果。结果主要包括:打字速度和错误率。在录入过程中,显示当前速度和剩余时间。为了时实提醒用户打字速度和打字时间必需可以时实提示打字速度和剩余时间(剩余时间是设置的测试时间减掉已使用的时间) 。使用菜单栏。要求菜单栏可以从“文件打开”添加文件,可以从“文件退出”退出程序,可以从“帮助关于”了解程序信息。多情况结束测试。1、当测试结束时,结束测试。2、当点击“结束测试”按钮结束测试。3、当文章录入完成结束测试。文字录入是学习计算机非常重要的一部分。在手写录入技术和语音识别技术还不完善的同时大部分人还在使用键盘作为文字录入的工具。所以我编了这样一个小程序,同时也是我的面向对象程序设计的课程设计
8、。3.2 系统体系结构本程序主要分为以下几个子模块:添加文件、打开、退出、关于、开始测试、结束测试等。系统结构设计图如图 3-1 所示。- 4 -图 3-1 系统功能模块图3.3 程序结构设计根据分析最后决定本程序整体是用一个 Typer 主类和用一个 TyperProgram 类完成图形界面和监听响应事件,在内部用 Timer 类实现对系统时间监控显示和完成录入后的成绩计算。其中监听键盘和文本输入用匿名内部类来实现,TyperProgram 和 Timer 用多线程来实现并发运行。当程序运行时 TyperProgram 的对象先运行,当点击开始按钮时 Timer 对象开始运行。主要应用到的
9、API 类有:java.io.*;java.awt.*;java.awt.event.*;javax.swing.*;javax.swing.event.*;javax.swing.filechooser.FileFilter。程序的主类是 Typer。需要编写的主要函数有:setWindow()用来设计用户界面,整体的 JFrame 用 BorderLayout 进行布局分成北中南三个块。其中北边是一个用 GridLayout 布局的 JPanel 分成 0 行 2 列,两列中分别是一个 JTextField;中间是一个 GridLayout 布局的 JPanel 分成 2 行 1 列;南边
10、是一个 FlowLayout 布局的 JPanel,里面放两个居中的按钮。setListener()用来设置多种监听,如事件监听,键盘监听,文本监听等。其中事件监听由于实现了接口 ActyionListener,直接添加本类,再于函数 actionPerformed()来实现,而其它监听都用的是匿名内部类来实现。很成功地完成了多种监听处理功能。putScore()用来结束测试后,统计错误率,并将错误率显示在界面,右上方的JTextField 中。其它函数主要用于实现接口或者完成上面函数的部分功能。打字速度测试程序添加文件打开 退出 关于 开始测试结束测试- 5 -程序结构设计如图 3-2图 3
11、-2 程序结构模块图4 详细设计4.1 起始界面设计窗口为一个添加菜单栏的 JFrame,菜单栏包括主要有文件和帮助两个部分,整体的JFrame 用 BorderLayout 进行布局分成北中南三个块。其中北边是一个用 GridLayout布局的 JPanel 分成 0 行 2 列,两列中分别是一个 JTextField;中间是一个 GridLayout布局的 JPanel 分成 2 行 1 列,每行分别为一个 CardLayout 布局的 JPanel,其中第一行里放了一个带按钮的 JPanel 和一个 JTextArea,第二行里为一带图片的 JPanel 和和个JTextArea;南边是
12、一个 FlowLayout 布局的 JPanel,里面放两个居中的按钮。主要代码如下:JFrame jf=new JFrame(“xxx打字高手“);Container cont=jf.getContentPane();public class Typerpublic static void main(String args)TyperProgram tp=new TyperProgram();tp.start();class TyperProgram extends Thread implements ActionListener public void setWindow();public
13、 void setListener();public void actionPerformed(ActionEvent e)public void run()setWindow();setListener();private class Timer implements Runnablepublic void putScore()public void run()- 6 -cont.setLayout(new BorderLayout();jm=new JMenu(“文件“);jmHelp=new JMenu(“帮助“);jmi=new JMenuItem(“打开“);jmi.setActio
14、nCommand(“打开“);jmi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,InputEvent.CTRL_MASK);jmiExit= new JMenuItem(“退出“);jmiExit.setActionCommand(“退出“);jmiAbout=new JMenuItem(“关于“);jmiAbout.setActionCommand(“关于“);jm.add(jmi);jm.addSeparator();jm.add(jmiExit);jmHelp.add(jmiAbout);jmb.add(jm);jmb.add
15、(jmHelp);JPanel jptf=new JPanel(new GridLayout(0,2);jptf.add(jtf1);jptf.add(jtf2);cont.add(BorderLayout.NORTH,jptf);jpg.setLayout(new GridLayout(2,0,0,30);jta1=new JTextArea();jta2=new JTextArea()private static final long serialVersionUID = 1L;Override public void paste();jbAdd=new JButton(“添加文件 “);
16、jbAdd.setActionCommand(“打开“);jpb=new JPanel(new CardLayout(300,80);jpb.add(“card“,jbAdd);jpc1.add(“card1“,jpb);jpc1.add(“card2“,jta1);- 7 -JLabel jpng=new JLabel(new ImageIcon(“image/keyboard.jpg“);jpc2=new JPanel(card2);jpc2.add(“card1“,jpng);jpc2.add(“card2“,jta2);jpg.add(jpc1);jpg.add(jpc2);cont.
17、add(BorderLayout.CENTER,jpg);jpf=new JPanel();jpf.setLayout(new FlowLayout(FlowLayout.CENTER,50,0);jb1=new JButton(“开始测试“);jb1.setActionCommand(“开始“);jb2=new JButton(“结束测试“);jb2.setActionCommand(“结束“);jpf.add(jb1);jpf.add(jb2);cont.add(BorderLayout.SOUTH,jpf);起始界面如图4-1:图4-1 起始界面图4.2 添加文件界面设计添加打开文件用打
18、开对话框,并对对话框添加文件过滤器,代码如下:JFileChooser fileCh=new JFileChooser();fileCh.setCurrentDirectory(new File(“files“);fileCh.setFileFilter(new FileFilter()- 8 -public boolean accept(File f)return f.getName().toLowerCase().endsWith(“.txt“)|f.isDirectory();public String getDescription()return “文本文档 *.txt*“;);if(
19、fileCh.showOpenDialog(null)=JFileChooser.CANCEL_OPTION)return;getPath=fileCh.getSelectedFile();if(!getPath.getPath().toLowerCase().endsWith(“.txt“)JOptionPane.showMessageDialog(null,“请选择文本文档“,“提示“,JOptionPane.INFORMATION_MESSAGE);return;添加文件界面设计如图 4-2:- 9 -图 4-2 添加文件界面图4.3 设置测试时间设计录入时间设定用一个对话框实现,并接收
20、输入信息,默认录入测试时间为 5 分钟,主要代码如下:JPanel jp=new JPanel(new GridLayout(2,0);JLabel jlab=new JLabel(“设置测试时间(分):“);JTextField jtfTime=new JTextField();jtfTime.setText(“5“);jp.add(jlab);jp.add(jtfTime);int select=JOptionPane.showConfirmDialog(null,jp,“设置“,JOptionPane.OK_CANCEL_OPTION,JOptionPane.PLAIN_MESSAGE)
21、;- 10 -if(select!=JOptionPane.OK_OPTION)return;strTime=jtfTime.getText();测试时间设置如图 4-3图 4-3 测试时间设置图4.4 速度和剩余时间设计实时显示录入速度和剩余时间通过实现 Runnable 接口的一个 Timer 类来计算实现。当开始录入时获取一个系统时间 startTime=System.currentTimeMillis(),然后每隔一秒获取一个系统时间 nowTime=System.currentTimeMillis(),同时统计当前录入的字数 count=jta2.getText().length()
22、,字数除以用两个时间之差得到速度最后单位换算为(字/分) ;剩余时间等于设置时间减去花费的时间 remainTime=setTime-spendTime最后转换为*分 *秒。如图 4-4- 11 -图 4-4 测试进行中4.5 显示测试成绩显示录入速度和错误率。录入速度计算同上,错误率等于总的错字数/录入总字数error=(words+l)=0?0:(errorWords+k)*1.0/(words+l)*100(注:如果没有录入就结束测试,错误率为 0%) 。如图 4-5- 12 -图 4-5 测试结束5 系统测试系统测试是一个系统在正式投入到使用运行之前,对于该系统的需求分析、系统的设计规
23、格、程序的可执行代码以及系统各功能模块的使用情况等方面进行全面的审查和验收,从而判断该系统是否能够满足用户的需求,可见系统测试是对系统质量把关过程中至关重要的一步。5.1 系统测试的方法运行程序,测试程序是否能正常运行,是否有错误,或者异常,同时检测程序的 cpu和内存的占用率。5.2 程序测试寻找若干名用户,使用本程序进行打字测试,征求改进意义。正常运行顺序如下:添加文件/打开开始测试结束测试,非正常的运行会弹出提示对话框。6 设计总结本次课程设计提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼了我分析解决实际问题的能力。提高我的适应实际,实践编程的能力。
24、本课程设计旨在培养了我的动手能力和学习能力。通过对动手编写本程序,我可以学习更多的实用内容和方法,而这些资料多以英文方式给出,不但锻炼了我的学习能力,而且还锻炼我的阅读和理解能力。此外本程序还存在一些问题待完善,测试过程中录入错字后要没有标记,不能很好的显示出错的字。另外在一些低版本的 jdk1.6 中,录入时会出现无法录入英文和数字,只能输入中文,也无法退格(backspace)的现象。建议使用较高版本的 jdk1.6,或者使用jdk1.7 以上版本。随着科学技术的不断提高,计算机科学目渐成熟,计算机怩深入到工作和生活的各个角落,文字录入是学习计算机非常重要的一部分。在手写录入技术和语音识别
25、技术还不完善的同时大部分人还在使用键盘作为文字录入的工具。所以我编了这样一个小程序,同时也是我的面向对象程序设计的课程设计。希望能对电脑初学都和想提高打字速度的朋友们有所帮助。- 13 -参考文献1 Java 大学实用教程耿祥义编著.电子工业出版社 .2005 年版2 数据库原理及应用教程.陈志泊主编.人民邮电出版社。3 数据库实验指导.杨海霞等编著.人民邮电出版社。参考书:Eclipse RCP Tutor ,Eclipse 组织,网址 http:/www.eclipse.org/rcp附录import java.io.*;import java.awt.*;import java.awt.
26、event.*;import javax.swing.*;import javax.swing.event.*;import javax.swing.filechooser.FileFilter;class TyperProgram extends Thread implements ActionListener private JPanel jpc1,jpc2;private JMenuItem jmi,jmiExit,jmiAbout;private JTextField jtf1,jtf2;private JTextArea jta1,jta2;private JButton jb1,j
27、b2,jbAdd;private CardLayout card1,card2;private String state=“,strTime=“;private StringBuffer strbFile;private int words,errorWords;private double startTime;private File getPath;private BufferedReader buf;private boolean fileOver,lock=true;private class Timer implements Runnablepublic void putScore(
28、)jta2.setEditable(false);- 14 -String str1,str2;int l1,l2;str1=jta1.getText();l1=str1.length();str2=jta2.getText();l2=str2.length();double error;int k=l1l2?l2-l1:0,l=l1l2?l1:l2;for(int i=0;il;i+)if(str1.charAt(i)!=str2.charAt(i)k+;error=(words+l)=0?0:(errorWords+k)*1.0/(words+l)*100;jtf2.setText(“错误
29、率:“+Math.ceil(error*100)/100.0+“%“);errorWords=0;words=0;state=“addFile“;lock=true;jb1.requestFocus();public void run()double nowTime,spendTime,setTime,speed=0,remainTime;int count,remainMin,remainSec;nowTime=System.currentTimeMillis();spendTime=(nowTime-startTime)/60000;setTime=Double.parseDouble(s
30、trTime);while(spendTimesetTimespeed=(words+count)/spendTime;remainTime=setTime-spendTime;remainMin=(int)remainTime;remainSec=(int)Math.round(remainTime-remainMin)*60);jtf1.setText(“当前的速度:“+Math.round(speed)+“字/分“);jtf2.setText(“剩余时间:“+remainMin+“分“+remainSec+“秒“);tryThread.sleep(1000);catch(Exceptio
31、n e)e.printStackTrace();nowTime=System.currentTimeMillis();spendTime=(nowTime-startTime)/60000;jtf1.setText(“速度:“+Math.round(speed)+“字/分“);putScore();public void setWindow()JFrame jf=new JFrame(“xxx 打字高手“);- 15 -Container cont=jf.getContentPane();cont.setLayout(new BorderLayout();Font ft=new Font(“新
32、新字体“,Font.PLAIN,20);JMenuBar jmb=new JMenuBar();JMenu jm,jmHelp;jm=new JMenu(“文件“);jmHelp=new JMenu(“帮助“);jmi=new JMenuItem(“打开“);jmi.setActionCommand(“打开“);jmi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,InputEvent.CTRL_MASK);jmiExit= new JMenuItem(“退出“);jmiExit.setActionCommand(“退出“);jmiAb
33、out=new JMenuItem(“关于“);jmiAbout.setActionCommand(“关于“);jm.add(jmi);jm.addSeparator();jm.add(jmiExit);jmHelp.add(jmiAbout);jmb.add(jm);jmb.add(jmHelp);jtf1=new JTextField();jtf1.setFont(ft);jtf1.setEditable(false);jtf2=new JTextField();jtf2.setFont(ft);jtf2.setEditable(false);JPanel jptf=new JPanel(
34、new GridLayout(0,2);jptf.add(jtf1);jptf.add(jtf2);cont.add(BorderLayout.NORTH,jptf);JPanel jpg,jpf,jpb;jpg=new JPanel();jpg.setLayout(new GridLayout(2,0,0,30);jta1=new JTextArea();jta2=new JTextArea()private static final long serialVersionUID = 1L;Override public void paste();jta1.setFont(ft);jta1.s
35、etLineWrap(true);jta1.setEditable(false);jta1.setBackground(new Color(200,255,200);jta2.setFont(ft);jta2.setLineWrap(true);jta2.setEditable(false);jta2.setBackground(new Color(200,200,255);- 16 -jbAdd=new JButton(“添加文件“);jbAdd.setActionCommand(“打开“);jpb=new JPanel(new CardLayout(300,80);jpb.add(“car
36、d“,jbAdd);card1=new CardLayout();jpc1=new JPanel(card1);jpc1.add(“card1“,jpb);jpc1.add(“card2“,jta1);JLabel jpng=new JLabel(new ImageIcon(“image/keyboard.jpg“);card2=new CardLayout();jpc2=new JPanel(card2);jpc2.add(“card1“,jpng);jpc2.add(“card2“,jta2);jpg.add(jpc1);jpg.add(jpc2);cont.add(BorderLayou
37、t.CENTER,jpg);jpf=new JPanel();jpf.setLayout(new FlowLayout(FlowLayout.CENTER,50,0);jb1=new JButton(“开始测试“);jb1.setActionCommand(“开始“);jb2=new JButton(“结束测试“);jb2.setActionCommand(“结束“);jpf.add(jb1);jpf.add(jb2);cont.add(BorderLayout.SOUTH,jpf);jf.setBounds(250,50,810,630);Toolkit toolkit = jf.getTo
38、olkit();Image image = toolkit.getImage(“image/chen.png“);jf.setIconImage(image);jf.setJMenuBar(jmb);jf.setVisible(true);jbAdd.requestFocus();jf.setResizable(false);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);public void readyFile()String strFile=“;FileReader in=null;tryString strLine=“;in=new
39、FileReader(getPath);buf=new BufferedReader(in);strLine=buf.readLine();while(strLine!=null)strFile+=strLine;strLine=buf.readLine();catch(IOException e1)e1.printStackTrace();- 17 -strbFile=new StringBuffer(strFile);fileOver=false;public void readFile()String strPart=“; int n=320;if(strbFile.length()=n
40、)jta1.setText(strbFile+“n“);fileOver=true;return;strPart=strbFile.substring(0,n);strbFile=strbFile.delete(0,n);jta1.setText(strPart+“n“);public void addFile()JFileChooser fileCh=new JFileChooser();fileCh.setCurrentDirectory(new File(“files“);fileCh.setFileFilter(new FileFilter()public boolean accept
41、(File f)return f.getName().toLowerCase().endsWith(“.txt“)|f.isDirectory();public String getDescription()return “文本文档 *.txt*“;);if(fileCh.showOpenDialog(null)=JFileChooser.CANCEL_OPTION)return;getPath=fileCh.getSelectedFile();if(!getPath.getPath().toLowerCase().endsWith(“.txt“)JOptionPane.showMessage
42、Dialog(null,“请选择文本文档“,“提示“,JOptionPane.INFORMATION_MESSAGE);return;readyFile();readFile();state=“addFile“;card1.show(jpc1,“card2“);jb1.requestFocus();public boolean isDigit(String str)- 18 -int k=0;if(str.equals(“)return false;for(int i=0;istr.length();i+)if(str.charAt(i)=.if(!Character.isDigit(str.
43、charAt(i)return false;return true;public void setstart()JPanel jp=new JPanel(new GridLayout(2,0);JLabel jlab=new JLabel(“设置测试时间(分):“);JTextField jtfTime=new JTextField();jtfTime.setText(“5“);jp.add(jlab);jp.add(jtfTime);int select=JOptionPane.showConfirmDialog(null,jp,“设置“,JOptionPane.OK_CANCEL_OPTI
44、ON,JOptionPane.PLAIN_MESSAGE);if(select!=JOptionPane.OK_OPTION)return;strTime=jtfTime.getText();if(isDigit(strTime)if(jta1.getText()!=null)readyFile();readFile();card2.show(jpc2,“card2“);jta2.setText(null);jta2.setEditable(true);jta2.requestFocus();state=“start“;lock=false;startTime=System.currentTi
45、meMillis();Timer ti=new Timer();Thread t=new Thread(ti);t.start();elseJOptionPane.showMessageDialog(null,“请输入数字“,“提示“,JOptionPane.INFORMATION_MESSAGE);public void setListener()jmi.addActionListener(this);jmiExit.addActionListener(this);- 19 -jmiAbout.addActionListener(this);jbAdd.addActionListener(t
46、his);jb1.addActionListener(this);jb2.addActionListener(this);jbAdd.addKeyListener(new KeyListener()public void keyPressed(KeyEvent e1)if(e1.getKeyCode()=KeyEvent.VK_ENTER)addFile();public void keyReleased(KeyEvent e2)public void keyTyped(KeyEvent e2);jta2.getDocument().addDocumentListener(new Docume
47、ntListener()public void insertUpdate(DocumentEvent e1)String str1=jta1.getText();String str2=jta2.getText();if(str1.length()=str2.length()elsewords+=str2.length();for(int i=0;istr2.length();i+)if(str1.charAt(i)!=str2.charAt(i)errorWords+;EventQueue.invokeLater(new Runnable()public void run() jta2.se
48、tText(null););readFile();public void changedUpdate(DocumentEvent e2)public void removeUpdate(DocumentEvent e3);public void actionPerformed(ActionEvent e)String strAction=e.getActionCommand();if(strAction=“打开“- 20 -else if(strAction=“退出“)System.exit(1);else if(strAction=“关于“)String str=“ 版权所有(c):黄晨“;JOptionPane.showMessageDialog(null,str,“关于“,JOptionPane.PLAIN_MESSAGE);else if(strAction=“开始“elsesetstart();else if(strAction=“结束“)if(!state.equals(“start“)JOptionPane.showMessageDialog(null,“你还没有测试“,“提示“,JOptionPane.INFORMATION_MESSAGE);elsestate=“over“;public void run()setWindow();setListener();p