版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 11信計(jì)2012-2013(二)</p><p> 《Java程序設(shè)計(jì)》課程設(shè)計(jì)</p><p> 設(shè)計(jì)題目 打字速度測試程序 </p><p> 設(shè)計(jì)時(shí)間 2013.6.24 至 2013.6.29 </p><p> 學(xué)生姓名
2、 </p><p> 學(xué)生學(xué)號(hào) </p><p> 所在班級(jí) </p><p> 指導(dǎo)教師 </p><p><b> 摘要</b><
3、;/p><p> 二十世紀(jì)后半期,計(jì)算機(jī)取得了飛速的發(fā)展?,F(xiàn)在,隨著網(wǎng)絡(luò)技術(shù)的發(fā)展,計(jì)算機(jī)已經(jīng)成為人們生活中不可或缺的一部分。但是很多人對(duì)于計(jì)算機(jī)的操作能力及認(rèn)知極為匱乏,因此提高人們對(duì)計(jì)算機(jī)的了解以及操作能力已經(jīng)非常重要。而打字速度是用來衡量一個(gè)人操作熟練程度的一個(gè)重要方面。當(dāng)前打字軟件的市場已經(jīng)達(dá)到了一定的高度,本軟件設(shè)計(jì)開發(fā)的方式是僅僅是簡單的使用戶能夠測試自己的打字速度與正確率。 本軟件使用的開發(fā)工具是J
4、AVA,它是當(dāng)前比較流行的開發(fā)工具。在構(gòu)造圖形及其處理方面具有很強(qiáng)的優(yōu)勢,能夠?yàn)橛脩魳?gòu)造一個(gè)比較美觀的打字測試界面,并且能夠很好的測試您的打字速度以及正確率,請(qǐng)用戶放心使用。</p><p> 關(guān)鍵詞:打字速度;正確率;熟練度;JAVA </p><p><b> 目錄</b></p><p> 1 設(shè)計(jì)背景和意義1</p>
5、;<p> 1.1 設(shè)計(jì)背景1</p><p> 1.2 設(shè)計(jì)目的及意義1</p><p><b> 2 需求分析1</b></p><p> 2.1 系統(tǒng)所需完成的任務(wù)1</p><p> 2.2 系統(tǒng)功能需求分析2</p><p><b> 3 總
6、體設(shè)計(jì)2</b></p><p> 3.1 系統(tǒng)設(shè)計(jì)目標(biāo)2</p><p> 3.2 系統(tǒng)體系結(jié)構(gòu)3</p><p> 3.3 程序結(jié)構(gòu)設(shè)計(jì)3</p><p><b> 4 詳細(xì)設(shè)計(jì)4</b></p><p> 4.1 起始界面設(shè)計(jì)5</p><
7、;p> 4.2 添加文件界面設(shè)計(jì)6</p><p> 4.3 設(shè)置測試時(shí)間設(shè)計(jì)7</p><p> 4.4 速度和剩余時(shí)間設(shè)計(jì)8</p><p> 4.5 顯示測試成績?cè)O(shè)計(jì)9</p><p><b> 5 系統(tǒng)測試9</b></p><p> 5.1 系統(tǒng)測試的方法1
8、0</p><p> 5.2 程序測試10</p><p><b> 6 設(shè)計(jì)總結(jié)10</b></p><p><b> 參考文獻(xiàn)11</b></p><p><b> 附錄12</b></p><p><b> 1 設(shè)計(jì)背景
9、和意義</b></p><p><b> 1.1 設(shè)計(jì)背景</b></p><p> 二十世紀(jì)的后半期,尤其是90年代后,計(jì)算機(jī)取得了飛速的發(fā)展。近來,隨著網(wǎng)絡(luò)的發(fā)展,計(jì)算機(jī)已經(jīng)成為人們生活中不可缺少的一部分。提高人們對(duì)計(jì)算機(jī)的操作能力顯得尤為重要。而打字速度是衡量一個(gè)人操作熟練的一個(gè)重要方面。因此開發(fā)一種高效的打字程序顯得迫在眉睫。目前大多數(shù)打字程序
10、都是只能在Windows下運(yùn)行,跨平臺(tái)運(yùn)行能力不是很強(qiáng)。為了適應(yīng)當(dāng)下的需求,格外需要一款能夠新的打字程序。</p><p> 本程序使用的開發(fā)工具是java1.7,它目前是比較流行的java語言開發(fā)工具,在執(zhí)行效率方面表現(xiàn)良好,在跨平臺(tái)方面更是強(qiáng)項(xiàng)。因此用戶可以放心使用。</p><p> 1.2 設(shè)計(jì)目的及意義</p><p> 隨著科學(xué)技術(shù)的不斷提高,計(jì)算
11、機(jī)科學(xué)目漸成熟,計(jì)算機(jī)怩深入到工作和生活的各個(gè)角落,文字錄入是學(xué)習(xí)計(jì)算機(jī)非常重要的一部分。在手寫錄入技術(shù)和語音識(shí)別技術(shù)還不完善的同時(shí)大部分人還在使用鍵盤作為文字錄入的工具。所以我編了這樣一個(gè)小程序,同時(shí)也是我的面向?qū)ο蟪绦蛟O(shè)計(jì)的課程設(shè)計(jì)。希望能對(duì)電腦初學(xué)都和想提高打字速度的朋友們有所幫助。</p><p> 本系統(tǒng)構(gòu)建學(xué)生打字練習(xí)系統(tǒng),基于所開發(fā)的打字程序界面友好,圖形復(fù)雜。打字練習(xí)程序中應(yīng)用到eclipse最
12、新版本,java1.7以上版本的jdk。對(duì)于打字測試進(jìn)入整體的部署。完成打字練習(xí)程序開發(fā),培養(yǎng)程序設(shè)計(jì)和開發(fā)能力。</p><p><b> 2 需求分析</b></p><p> 2.1 系統(tǒng)所需完成的任務(wù)</p><p> 打字速度測試程序。要求設(shè)計(jì)一款打字速度測試程序,要求界面良好,實(shí)現(xiàn)從磁盤上尋找打開一個(gè)文件、設(shè)置打字時(shí)間、時(shí)實(shí)顯
13、示打字速度和剩余時(shí)間等功能,應(yīng)用到GUI,多線程,文件的輸入輸出等知識(shí)。</p><p> 需要從磁盤打開要錄入文件的樣本,錄入前可以設(shè)定錄入練習(xí)時(shí)間,錄入時(shí)需要實(shí)時(shí)顯示錄入速度和剩余時(shí)間,錄入結(jié)束后,顯示錄入速度和錯(cuò)誤率。錄入結(jié)束方式可以通過點(diǎn)擊“結(jié)束測試”按鈕結(jié)束測試,文章錄入完成也自動(dòng)結(jié)束錄入,到達(dá)設(shè)置時(shí)間也自動(dòng)結(jié)束錄入。最后要求圖形界面,界面良好美觀。</p><p> 根據(jù)任
14、務(wù)要求主要遇到的問題在于如何很好的監(jiān)聽按鍵菜單事件,監(jiān)聽部分鍵盤如(ctrl+o和enter);如何在打開文件對(duì)話框中過濾只顯示txt和目錄文件,讀取文件后如何一部一部地顯示并能正確統(tǒng)計(jì)錄入字?jǐn)?shù)和錯(cuò)誤字?jǐn)?shù);如何在錄入文章時(shí),同時(shí)監(jiān)控系統(tǒng)時(shí)間,并能盡量減少cpu占用。</p><p> 2.2 系統(tǒng)功能需要分析</p><p> 經(jīng)過對(duì)現(xiàn)有一般打字程序的使用者的調(diào)查與分析,得出若要編寫此
15、打字程序,本程序必需主要實(shí)現(xiàn)的管理功能如下:</p><p> 添加文件。從磁盤添加現(xiàn)有的文本文件顯示在程序界面上方。</p><p> 設(shè)置測試時(shí)間。在打字開始前,可以設(shè)置測試時(shí)間,方便快捷地結(jié)束測試。</p><p> 顯示測試結(jié)果。結(jié)果主要包括:打字速度和錯(cuò)誤率。</p><p> 在錄入過程中,顯示當(dāng)前速度和剩余時(shí)間。為了時(shí)實(shí)
16、提醒用戶打字速度和打字時(shí)間必需可以時(shí)實(shí)提示打字速度和剩余時(shí)間(剩余時(shí)間是設(shè)置的測試時(shí)間減掉已使用的時(shí)間)。</p><p> 使用菜單欄。要求菜單欄可以從“文件——>打開”添加文件,可以從“文件——>退出”退出程序,可以從“幫助——>關(guān)于”了解程序信息。</p><p> 多情況結(jié)束測試。1、當(dāng)測試結(jié)束時(shí),結(jié)束測試。2、當(dāng)點(diǎn)擊“結(jié)束測試”按鈕結(jié)束測試。3、當(dāng)文章錄入完
17、成結(jié)束測試。</p><p><b> 3 總體設(shè)計(jì)</b></p><p> 3.1 系統(tǒng)設(shè)計(jì)目標(biāo)</p><p> 從磁盤添加現(xiàn)有的文本文件顯示在程序界面上方。在打字開始前,可以設(shè)置測試時(shí)間,方便快捷地結(jié)束測試。顯示測試結(jié)果。結(jié)果主要包括:打字速度和錯(cuò)誤率。在錄入過程中,顯示當(dāng)前速度和剩余時(shí)間。為了時(shí)實(shí)提醒用戶打字速度和打字時(shí)間必需可
18、以時(shí)實(shí)提示打字速度和剩余時(shí)間(剩余時(shí)間是設(shè)置的測試時(shí)間減掉已使用的時(shí)間)。使用菜單欄。要求菜單欄可以從“文件——>打開”添加文件,可以從“文件——>退出”退出程序,可以從“幫助——>關(guān)于”了解程序信息。多情況結(jié)束測試。1、當(dāng)測試結(jié)束時(shí),結(jié)束測試。2、當(dāng)點(diǎn)擊“結(jié)束測試”按鈕結(jié)束測試。3、當(dāng)文章錄入完成結(jié)束測試。文字錄入是學(xué)習(xí)計(jì)算機(jī)非常重要的一部分。在手寫錄入技術(shù)和語音識(shí)別技術(shù)還不完善的同時(shí)大部分人還在使用鍵盤作為文字錄入
19、的工具。所以我編了這樣一個(gè)小程序,同時(shí)也是我的面向?qū)ο蟪绦蛟O(shè)計(jì)的課程設(shè)計(jì)。</p><p> 3.2 系統(tǒng)體系結(jié)構(gòu)</p><p> 本程序主要分為以下幾個(gè)子模塊:添加文件、打開、退出、關(guān)于、開始測試、結(jié)束測試等。系統(tǒng)結(jié)構(gòu)設(shè)計(jì)圖如圖3-1所示。</p><p> 圖3-1系統(tǒng)功能模塊圖</p><p> 3.3 程序結(jié)構(gòu)設(shè)計(jì)</
20、p><p> 根據(jù)分析最后決定本程序整體是用一個(gè)Typer主類和用一個(gè)TyperProgram類完成圖形界面和監(jiān)聽響應(yīng)事件,在內(nèi)部用Timer類實(shí)現(xiàn)對(duì)系統(tǒng)時(shí)間監(jiān)控顯示和完成錄入后的成績計(jì)算。其中監(jiān)聽鍵盤和文本輸入用匿名內(nèi)部類來實(shí)現(xiàn),TyperProgram和Timer用多線程來實(shí)現(xiàn)并發(fā)運(yùn)行。當(dāng)程序運(yùn)行時(shí)TyperProgram的對(duì)象先運(yùn)行,當(dāng)點(diǎn)擊開始按鈕時(shí)Timer對(duì)象開始運(yùn)行。</p><p&
21、gt; 主要應(yīng)用到的API類有:</p><p> java.io.*;java.awt.*;java.awt.event.*;javax.swing.*;javax.swing.event.*;javax.swing.filechooser.FileFilter。程序的主類是Typer。</p><p> 需要編寫的主要函數(shù)有:</p><p> setW
22、indow()用來設(shè)計(jì)用戶界面,整體的JFrame用BorderLayout進(jìn)行布局分成北中南三個(gè)塊。其中北邊是一個(gè)用GridLayout布局的JPanel分成0行2列,兩列中分別是一個(gè)JTextField;中間是一個(gè)GridLayout布局的JPanel分成2行1列;南邊是一個(gè)FlowLayout布局的JPanel,里面放兩個(gè)居中的按鈕。</p><p> setListener()用來設(shè)置多種監(jiān)聽,如事件監(jiān)
23、聽,鍵盤監(jiān)聽,文本監(jiān)聽等。其中事件監(jiān)聽由于實(shí)現(xiàn)了接口ActyionListener,直接添加本類,再于函數(shù)actionPerformed()來實(shí)現(xiàn),而其它監(jiān)聽都用的是匿名內(nèi)部類來實(shí)現(xiàn)。很成功地完成了多種監(jiān)聽處理功能。</p><p> putScore()用來結(jié)束測試后,統(tǒng)計(jì)錯(cuò)誤率,并將錯(cuò)誤率顯示在界面,右上方的JTextField中。</p><p> 其它函數(shù)主要用于實(shí)現(xiàn)接口或者完
24、成上面函數(shù)的部分功能。</p><p> 程序結(jié)構(gòu)設(shè)計(jì)如圖3-2</p><p> 圖3-2 程序結(jié)構(gòu)模塊圖</p><p><b> 4 詳細(xì)設(shè)計(jì)</b></p><p> 4.1 起始界面設(shè)計(jì)</p><p> 窗口為一個(gè)添加菜單欄的JFrame,菜單欄包括主要有文件和幫助兩個(gè)部分,
25、整體的JFrame用BorderLayout進(jìn)行布局分成北中南三個(gè)塊。其中北邊是一個(gè)用GridLayout布局的JPanel分成0行2列,兩列中分別是一個(gè)JTextField;中間是一個(gè)GridLayout布</p><p> 局的JPanel分成2行1列,每行分別為一個(gè)CardLayout布局的JPanel,其中第一行里放了一個(gè)帶按鈕的JPanel和一個(gè)JTextArea,第二行里為一個(gè)JTextArea;南
26、邊是一個(gè)FlowLayout布局的JPanel,里面放兩個(gè)居中的按鈕。主要代碼如下:</p><p> JFrame jf=new JFrame(“11控制云堯作品——打字軟件”);</p><p> Container cont=jf.getContentPane();</p><p> cont.setLayout(new BorderLayout());
27、</p><p> jm=new JMenu("文件");</p><p> jmHelp=new JMenu("幫助");</p><p> jmi=new JMenuItem("打開");</p><p> jmi.setActionCommand("打開&
28、quot;);</p><p> jmi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,InputEvent.CTRL _MASK));</p><p> jmiExit= new JMenuItem("退出");jmiExit.setActionCommand("退出");</
29、p><p> jmiAbout=new JMenuItem("關(guān)于");jmiAbout.setActionCommand("關(guān)于");</p><p> jm.add(jmi);jm.addSeparator();jm.add(jmiExit);</p><p> jmHelp.add(jmiAbout);</p&g
30、t;<p> jmb.add(jm);jmb.add(jmHelp);</p><p> JPanel jptf=new JPanel(new GridLayout(0,2));</p><p> jptf.add(jtf1);jptf.add(jtf2);</p><p> cont.add(BorderLayout.NORTH,jptf);
31、</p><p> jpg.setLayout(new GridLayout(2,0,0,30));</p><p> jta1=new JTextArea();</p><p> jta2=new JTextArea(){</p><p> private static final long serialVersionUID = 1
32、L;</p><p> @Override public void paste(){}</p><p><b> };</b></p><p> jbAdd=new JButton("添加文件");jbAdd.setActionCommand("打開");</p><p>
33、 jpb=new JPanel(new CardLayout(300,80));</p><p> jpb.add("card",jbAdd);</p><p> jpc1.add("card1",jpb);jpc1.add("card2",jta1);</p><p> JLabel jpng=ne
34、w JLabel(new ImageIcon("image/keyboard.jpg"));</p><p> jpc2=new JPanel(card2);</p><p> jpc2.add("card1",jpng);jpc2.add("card2",jta2);</p><p> jpg.ad
35、d(jpc1);jpg.add(jpc2);</p><p> cont.add(BorderLayout.CENTER,jpg);</p><p> jpf=new JPanel();</p><p> jpf.setLayout(new FlowLayout(FlowLayout.CENTER,50,0));</p><p> j
36、b1=new JButton("開始測試");jb1.setActionCommand("開始");</p><p> jb2=new JButton("結(jié)束測試");jb2.setActionCommand("結(jié)束");</p><p> jpf.add(jb1);jpf.add(jb2);</p&
37、gt;<p> cont.add(BorderLayout.SOUTH,jpf);</p><p> 起始界面如圖4-1:</p><p> 圖4-1 起始界面圖</p><p> 4.2 添加文件界面設(shè)計(jì)</p><p> 添加打開文件用打開對(duì)話框,并對(duì)對(duì)話框添加文件過濾器,代碼如下:</p><
38、p> JFileChooser fileCh=new JFileChooser();</p><p> fileCh.setCurrentDirectory(new File("files"));</p><p> fileCh.setFileFilter(new FileFilter(){</p><p> public bool
39、ean accept(File f){</p><p> return f.getName().toLowerCase().endsWith(".txt")||f.isDirectory();</p><p><b> }</b></p><p> public String getDescription(){&
40、lt;/p><p> return "文本文檔 *.txt*";</p><p><b> }</b></p><p><b> });</b></p><p> if(fileCh.showOpenDialog(null)==JFileChooser.CANCEL_OPTI
41、ON)return;</p><p> getPath=fileCh.getSelectedFile();</p><p> if(!getPath.getPath().toLowerCase().endsWith(".txt")){</p><p> JOptionPane.showMessageDialog(null,"請(qǐng)選擇
42、文本文檔","提示",JOptionPane.INFORMATION_MESSAGE);</p><p><b> return;</b></p><p><b> }</b></p><p> 添加文件界面設(shè)計(jì)如圖4-2:</p><p> 圖4-2 添加文件
43、界面圖</p><p> 4.3 設(shè)置測試時(shí)間設(shè)計(jì)</p><p> 錄入時(shí)間設(shè)定用一個(gè)對(duì)話框?qū)崿F(xiàn),并接收輸入信息,默認(rèn)錄入測試時(shí)間為5分鐘,主要代碼如下:</p><p> JPanel jp=new JPanel(new GridLayout(2,0));</p><p> JLabel jlab=new JLabel("
44、;設(shè)置測試時(shí)間(分):");</p><p> JTextField jtfTime=new JTextField();</p><p> jtfTime.setText("5");</p><p> jp.add(jlab);jp.add(jtfTime);</p><p> int select=JO
45、ptionPane.showConfirmDialog(null,jp,"設(shè)置",JOptionPane.OK_CANCEL_OPTION,JOptionPane.PLAIN_MESSAGE);</p><p> if(select!=JOptionPane.OK_OPTION)return;</p><p> strTime=jtfTime.getText();&
46、lt;/p><p> 測試時(shí)間設(shè)置如圖4-3</p><p> 圖4-3 測試時(shí)間設(shè)置圖</p><p> 4.4 速度和剩余時(shí)間設(shè)計(jì)</p><p> 實(shí)時(shí)顯示錄入速度和剩余時(shí)間通過實(shí)現(xiàn)Runnable接口的一個(gè)Timer類來計(jì)算實(shí)現(xiàn)。當(dāng)開始錄入時(shí)獲取一個(gè)系統(tǒng)時(shí)間startTime=System.currentTimeMillis(),
47、然后每隔一秒獲取一個(gè)系統(tǒng)時(shí)間nowTime=System.currentTimeMillis(),同時(shí)統(tǒng)計(jì)當(dāng)前錄入的字?jǐn)?shù)count=jta2.getText().length(),字?jǐn)?shù)除以用兩個(gè)時(shí)間之差得到速度最后單位換算為(字/分);剩余時(shí)間等于設(shè)置時(shí)間減去花費(fèi)的時(shí)間remainTime=setTime-spendTime最后轉(zhuǎn)換為*分*秒。如圖4-4</p><p><b> 圖4-4測試進(jìn)行中&
48、lt;/b></p><p> 4.5 顯示測試成績</p><p> 顯示錄入速度和錯(cuò)誤率。錄入速度計(jì)算同上,錯(cuò)誤率等于總的錯(cuò)字?jǐn)?shù)/錄入總字?jǐn)?shù)error=(words+l)==0?0:((errorWords+k)*1.0/(words+l))*100(注:如果沒有錄入就結(jié)束測試,錯(cuò)誤率為0%)。如圖4-5</p><p> 圖4-5 測試結(jié)束<
49、;/p><p><b> 5 系統(tǒng)測試</b></p><p> 系統(tǒng)測試是一個(gè)系統(tǒng)在正式投入到使用運(yùn)行之前,對(duì)于該系統(tǒng)的需求分析、系統(tǒng)的設(shè)計(jì)規(guī)格、程序的可執(zhí)行代碼以及系統(tǒng)各功能模塊的使用情況等方面進(jìn)行全面的審查和驗(yàn)收,從而判斷該系統(tǒng)是否能夠滿足用戶的需求,可見系統(tǒng)測試是對(duì)系統(tǒng)質(zhì)量把關(guān)過程中至關(guān)重要的一步。</p><p> 5.1 系統(tǒng)測試
50、的方法</p><p> 運(yùn)行程序,測試程序是否能正常運(yùn)行,是否有錯(cuò)誤,或者異常,同時(shí)檢測程序的cpu和內(nèi)存的占用率。</p><p><b> 5.2 程序測試</b></p><p> 尋找若干名用戶,使用本程序進(jìn)行打字測試,征求改進(jìn)意義。正常運(yùn)行順序如下:添加文件/打開——>開始測試——>結(jié)束測試,非正常的運(yùn)行會(huì)彈出提示
51、對(duì)話框。</p><p><b> 6 設(shè)計(jì)總結(jié)</b></p><p> 本次課程設(shè)計(jì)提供了一個(gè)既動(dòng)手又動(dòng)腦,獨(dú)立實(shí)踐的機(jī)會(huì),將課本上的理論知識(shí)和實(shí)際有機(jī)的結(jié)合起來,鍛煉了我分析解決實(shí)際問題的能力。提高我的適應(yīng)實(shí)際,實(shí)踐編程的能力。本課程設(shè)計(jì)旨在培養(yǎng)了我的動(dòng)手能力和學(xué)習(xí)能力。通過對(duì)動(dòng)手編寫本程序,我可以學(xué)習(xí)更多的實(shí)用內(nèi)容和方法,而這些資料多以英文方式給出,不但鍛
52、煉了我的學(xué)習(xí)能力,而且還鍛煉我的閱讀和理解能力。</p><p> 此外本程序還存在一些問題待完善,測試過程中錄入錯(cuò)字后要沒有標(biāo)記,不能很好的顯示出錯(cuò)的字。另外在一些低版本的jdk1.6中,錄入時(shí)會(huì)出現(xiàn)無法錄入英文和數(shù)字,只能輸入中文,也無法退格(backspace)的現(xiàn)象。建議使用較高版本的jdk1.6,或者使用jdk1.7以上版本。</p><p> 隨著科學(xué)技術(shù)的不斷提高,計(jì)算機(jī)
53、科學(xué)目漸成熟,計(jì)算機(jī)怩深入到工作和生活的各個(gè)角落,文字錄入是學(xué)習(xí)計(jì)算機(jī)非常重要的一部分。在手寫錄入技術(shù)和語音識(shí)別技術(shù)還不完善的同時(shí)大部分人還在使用鍵盤作為文字錄入的工具。所以我編了這樣一個(gè)小程序,同時(shí)也是我的面向?qū)ο蟪绦蛟O(shè)計(jì)的課程設(shè)計(jì)。希望能對(duì)電腦初學(xué)都和想提高打字速度的朋友們有所幫助。</p><p><b> 參考文獻(xiàn)</b></p><p> 《Java大學(xué)
54、實(shí)用教程》..耿祥義編著.電子工業(yè)出版社.2005年版</p><p> 2.《數(shù)據(jù)庫原理及應(yīng)用教程》.陳志泊主編.人民郵電出版社。</p><p> 3.《數(shù)據(jù)庫實(shí)驗(yàn)指導(dǎo)》.楊海霞等編著.人民郵電出版社。</p><p> 參考書:《Eclipse RCP Tutor》,Eclipse組織,網(wǎng)址http://www.eclipse.org/rcp</p
55、><p><b> 附錄:</b></p><p><b> 源程序:</b></p><p> import java.io.*;</p><p> import java.awt.*;</p><p> import java.awt.event.*;</p&
56、gt;<p> import javax.swing.*;</p><p> import javax.swing.event.*;</p><p> import javax.swing.filechooser.FileFilter;</p><p> class TyperProgram extends Thread implements
57、ActionListener {</p><p> private JPanel jpc1,jpc2;</p><p> private JMenuItem jmi,jmiExit,jmiAbout;</p><p> private JTextField jtf1,jtf2;</p><p> private JTextArea j
58、ta1,jta2;</p><p> private JButton jb1,jb2,jbAdd;</p><p> private CardLayout card1,card2;</p><p> private String state="",strTime="";</p><p> pri
59、vate StringBuffer strbFile;</p><p> private int words,errorWords;</p><p> private double startTime;</p><p> private File getPath;</p><p> private BufferedReader buf
60、;</p><p> private boolean fileOver,lock=true;</p><p> private class Timer implements Runnable{</p><p> public void putScore(){</p><p> jta2.setEditable(false);</
61、p><p> String str1,str2;int l1,l2;</p><p> str1=jta1.getText();l1=str1.length();</p><p> str2=jta2.getText();l2=str2.length();</p><p> double error;</p><p&g
62、t; int k=l1<l2?l2-l1:0,l=l1<l2?l1:l2;</p><p> for(int i=0;i<l;i++)</p><p> if(str1.charAt(i)!=str2.charAt(i))</p><p><b> k++;</b></p><p> erro
63、r=(words+l)==0?0:((errorWords+k)*1.0/(words+l))*100;</p><p> jtf2.setText("錯(cuò)誤率:"+Math.ceil(error*100)/100.0+"%");</p><p> errorWords=0;words=0;</p><p> state=
64、"addFile";lock=true;</p><p> jb1.requestFocus();</p><p><b> }</b></p><p> public void run(){</p><p> double nowTime,spendTime,setTime,speed=0,
65、remainTime;</p><p> int count,remainMin,remainSec;</p><p> nowTime=System.currentTimeMillis();</p><p> spendTime=(nowTime-startTime)/60000;</p><p> setTime=Double.p
66、arseDouble(strTime);</p><p> while(spendTime<setTime&&!state.equals("over")){</p><p> count=jta2.getText().length();</p><p> speed=(words+count)/spendTime;&l
67、t;/p><p> remainTime=setTime-spendTime;</p><p> remainMin=(int)remainTime;</p><p> remainSec=(int)Math.round((remainTime-remainMin)*60);</p><p> jtf1.setText("當(dāng)前的
68、速度:"+Math.round(speed)+"字/分");</p><p> jtf2.setText("剩余時(shí)間:"+remainMin+"分"+remainSec+"秒");</p><p><b> try{</b></p><p> Thr
69、ead.sleep(1000);</p><p> }catch(Exception e){</p><p> e.printStackTrace();</p><p><b> }</b></p><p> nowTime=System.currentTimeMillis();</p><p
70、> spendTime=(nowTime-startTime)/60000;</p><p><b> }</b></p><p> jtf1.setText("速度:"+Math.round(speed)+"字/分");</p><p> putScore();</p>&l
71、t;p><b> }</b></p><p><b> }</b></p><p> public void setWindow(){</p><p> JFrame jf=new JFrame("11控制云堯作品——打字軟件");</p><p> Contai
72、ner cont=jf.getContentPane();</p><p> cont.setLayout(new BorderLayout());</p><p> Font ft=new Font("新新字體",Font.PLAIN,20);</p><p> JMenuBar jmb=new JMenuBar();</p>
73、<p> JMenu jm,jmHelp;</p><p> jm=new JMenu("文件");</p><p> jmHelp=new JMenu("幫助");</p><p> jmi=new JMenuItem("打開");jmi.setActionCommand("
74、;打開");</p><p> jmi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,InputEvent.CTRL_MASK));</p><p> jmiExit= new JMenuItem("退出");jmiExit.setActionCommand("退出");<
75、/p><p> jmiAbout=new JMenuItem("關(guān)于");jmiAbout.setActionCommand("關(guān)于");</p><p> jm.add(jmi);jm.addSeparator();jm.add(jmiExit);</p><p> jmHelp.add(jmiAbout);</p&
76、gt;<p> jmb.add(jm);jmb.add(jmHelp);</p><p> jtf1=new JTextField();</p><p> jtf1.setFont(ft);</p><p> jtf1.setEditable(false);</p><p> jtf2=new JTextField()
77、;</p><p> jtf2.setFont(ft);</p><p> jtf2.setEditable(false);</p><p> JPanel jptf=new JPanel(new GridLayout(0,2));</p><p> jptf.add(jtf1);jptf.add(jtf2);</p>
78、<p> cont.add(BorderLayout.NORTH,jptf);</p><p> JPanel jpg,jpf,jpb;</p><p> jpg=new JPanel();</p><p> jpg.setLayout(new GridLayout(2,0,0,30));</p><p> jta1=ne
79、w JTextArea();</p><p> jta2=new JTextArea(){</p><p> private static final long serialVersionUID = 1L;</p><p> @Override public void paste(){}</p><p><b> };<
80、;/b></p><p> jta1.setFont(ft);</p><p> jta1.setLineWrap(true);</p><p> jta1.setEditable(false);</p><p> jta1.setBackground(new Color(200,255,200));</p>&l
81、t;p> jta2.setFont(ft);</p><p> jta2.setLineWrap(true);</p><p> jta2.setEditable(false);</p><p> jta2.setBackground(new Color(200,200,255));</p><p> jbAdd=new JB
82、utton("添加文件");</p><p> jbAdd.setActionCommand("打開");</p><p> jpb=new JPanel(new CardLayout(300,80));</p><p> jpb.add("card",jbAdd);</p><p
83、> card1=new CardLayout();</p><p> jpc1=new JPanel(card1);</p><p> jpc1.add("card1",jpb);jpc1.add("card2",jta1);</p><p> card2=new CardLayout();</p>
84、<p> jpc2=new JPanel(card2);</p><p> jpc2.add("card2",jta2);</p><p> jpg.add(jpc1);jpg.add(jpc2);</p><p> cont.add(BorderLayout.CENTER,jpg);</p><p>
85、 jpf=new JPanel();</p><p> jpf.setLayout(new FlowLayout(FlowLayout.CENTER,50,0));</p><p> jb1=new JButton("開始測試");jb1.setActionCommand("開始");</p><p> jb2=new
86、 JButton("結(jié)束測試");jb2.setActionCommand("結(jié)束");</p><p> jpf.add(jb1);jpf.add(jb2);</p><p> cont.add(BorderLayout.SOUTH,jpf);</p><p> jf.setBounds(250,50,810,630)
87、;</p><p> Toolkit toolkit = jf.getToolkit();</p><p> Image image = toolkit.getImage("image/chen.png");</p><p> jf.setIconImage(image);</p><p> jf.setJMenu
88、Bar(jmb);</p><p> jf.setVisible(true);</p><p> jbAdd.requestFocus();</p><p> jf.setResizable(false);</p><p> jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);</
89、p><p><b> }</b></p><p> public void readyFile(){</p><p> String strFile="";</p><p> FileReader in=null;</p><p><b> try{</
90、b></p><p> String strLine="";</p><p> in=new FileReader(getPath);</p><p> buf=new BufferedReader(in);</p><p> strLine=buf.readLine();</p><p&
91、gt; while(strLine!=null){</p><p> strFile+=strLine;</p><p> strLine=buf.readLine();</p><p><b> }</b></p><p> }catch(IOException e1){</p><p&g
92、t; e1.printStackTrace();</p><p><b> }</b></p><p> strbFile=new StringBuffer(strFile);</p><p> fileOver=false;</p><p><b> }</b></p>&
93、lt;p> public void readFile(){</p><p> String strPart=""; int n=320;</p><p> if(strbFile.length()<=n){</p><p> jta1.setText(strbFile+"\n");</p>&
94、lt;p> fileOver=true;</p><p><b> return;</b></p><p><b> }</b></p><p> strPart=strbFile.substring(0,n);</p><p> strbFile=strbFile.delete(0
95、,n);</p><p> jta1.setText(strPart+"\n");</p><p><b> }</b></p><p> public void addFile(){</p><p> JFileChooser fileCh=new JFileChooser();</p
96、><p> fileCh.setCurrentDirectory(new File("files"));</p><p> fileCh.setFileFilter(new FileFilter(){</p><p> public boolean accept(File f){</p><p> return f.g
97、etName().toLowerCase().endsWith(".txt")||f.isDirectory();</p><p><b> }</b></p><p> public String getDescription(){</p><p> return "文本文檔 *.txt*";&l
98、t;/p><p><b> }</b></p><p><b> });</b></p><p> if(fileCh.showOpenDialog(null)==JFileChooser.CANCEL_OPTION)return;</p><p> getPath=fileCh.getSele
99、ctedFile();</p><p> if(!getPath.getPath().toLowerCase().endsWith(".txt")){</p><p> JOptionPane.showMessageDialog(null,"請(qǐng)選擇文本文檔","提示",JOptionPane.INFORMATION_MESSA
100、GE);</p><p><b> return;</b></p><p><b> }</b></p><p> readyFile();</p><p> readFile();</p><p> state="addFile";</p
101、><p> card1.show(jpc1,"card2");</p><p> jb1.requestFocus();</p><p><b> }</b></p><p> public boolean isDigit(String str){</p><p><
102、b> int k=0;</b></p><p> if(str.equals(""))return false;</p><p> for(int i=0;i<str.length();i++){</p><p> if(str.charAt(i)=='.'&&k++==0)i++;
103、</p><p> if(!Character.isDigit(str.charAt(i)))return false;</p><p><b> }</b></p><p> return true;</p><p><b> }</b></p><p> pub
104、lic void setstart(){</p><p> JPanel jp=new JPanel(new GridLayout(2,0));</p><p> JLabel jlab=new JLabel("設(shè)置測試時(shí)間(分):");</p><p> JTextField jtfTime=new JTextField();</p
105、><p> jtfTime.setText("5");</p><p> jp.add(jlab);jp.add(jtfTime);</p><p> int select=JOptionPane.showConfirmDialog(null,jp,"設(shè)置",JOptionPane.OK_CANCEL_OPTION,JOpt
106、ionPane.PLAIN_MESSAGE);</p><p> if(select!=JOptionPane.OK_OPTION)return;</p><p> strTime=jtfTime.getText();</p><p> if(isDigit(strTime)){</p><p> if(jta1.getText()!
107、=null){</p><p> readyFile();</p><p> readFile();</p><p><b> }</b></p><p> card2.show(jpc2,"card2");</p><p> jta2.setText(null);&
108、lt;/p><p> jta2.setEditable(true);</p><p> jta2.requestFocus();</p><p> state="start";</p><p> lock=false;</p><p> startTime=System.currentTime
109、Millis();</p><p> Timer ti=new Timer();</p><p> Thread t=new Thread(ti);</p><p> t.start();</p><p><b> }</b></p><p><b> else{</b&
110、gt;</p><p> JOptionPane.showMessageDialog(null,"請(qǐng)輸入數(shù)字","提示",JOptionPane.INFORMATION_MESSAGE);</p><p><b> }</b></p><p><b> }</b></p&
111、gt;<p> public void setListener(){</p><p> jmi.addActionListener(this);</p><p> jmiExit.addActionListener(this);</p><p> jmiAbout.addActionListener(this);</p><
112、p> jbAdd.addActionListener(this);</p><p> jb1.addActionListener(this);</p><p> jb2.addActionListener(this);</p><p> jbAdd.addKeyListener(new KeyListener(){</p><p&g
113、t; public void keyPressed(KeyEvent e1){</p><p> if(e1.getKeyCode()==KeyEvent.VK_ENTER)</p><p> addFile();</p><p><b> }</b></p><p> public void keyRelea
114、sed(KeyEvent e2){}</p><p> public void keyTyped(KeyEvent e2){}</p><p><b> });</b></p><p> jta2.getDocument().addDocumentListener(new DocumentListener(){</p>&l
115、t;p> public void insertUpdate(DocumentEvent e1){</p><p> String str1=jta1.getText();</p><p> String str2=jta2.getText();</p><p> if(str1.length()==str2.length()&&str2
116、.endsWith("\n")){</p><p> if(fileOver){</p><p> state="over";</p><p><b> }</b></p><p><b> else{</b></p><p>
117、 words+=str2.length();</p><p> for(int i=0;i<str2.length();i++)</p><p> if(str1.charAt(i)!=str2.charAt(i))</p><p> errorWords++;</p><p> EventQueue.invokeLater(
118、new Runnable(){</p><p> public void run() {</p><p> jta2.setText(null);</p><p><b> }</b></p><p><b> });</b></p><p> readFile()
119、;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> public void changedUpdate(DocumentEvent e2){}</p><p>
120、 public void removeUpdate(DocumentEvent e3){}</p><p><b> });</b></p><p><b> }</b></p><p> public void actionPerformed(ActionEvent e){</p><p>
121、 String strAction=e.getActionCommand();</p><p> if(strAction=="打開"&&lock){</p><p> addFile();</p><p><b> }</b></p><p> else if(strAct
122、ion=="退出"){</p><p> System.exit(1);</p><p><b> }</b></p><p> else if(strAction=="關(guān)于"){</p><p> String str="版權(quán)所有(c):云堯";<
123、;/p><p> JOptionPane.showMessageDialog(null,str,"關(guān)于",JOptionPane.PLAIN_MESSAGE);</p><p><b> }</b></p><p> else if(strAction=="開始"&&lock){<
124、/p><p> if(!state.equals("addFile"))</p><p> JOptionPane.showMessageDialog(null,"你還沒有添加有效文檔","提示",JOptionPane.INFORMATION_MESSAGE);</p><p><b> el
125、se</b></p><p> setstart();</p><p><b> }</b></p><p> else if(strAction=="結(jié)束"){</p><p> if(!state.equals("start"))</p>&l
126、t;p> JOptionPane.showMessageDialog(null,"你還沒有測試","提示",JOptionPane.INFORMATION_MESSAGE);</p><p><b> else</b></p><p> state="over";</p><p
127、><b> }</b></p><p><b> }</b></p><p> public void run(){</p><p> setWindow();</p><p> setListener();</p><p><b> }</
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 打字訓(xùn)練測試軟件-java課程設(shè)計(jì)
- 怎樣打字速度快
- 論如何提高英文打字速度
- 微機(jī)原理課程設(shè)計(jì)----打字練習(xí)程序
- java課程設(shè)計(jì)---java程序設(shè)計(jì)
- java課程設(shè)計(jì)--java程序設(shè)計(jì)
- java課程設(shè)計(jì)--java面向?qū)ο蟪绦蛟O(shè)計(jì)課程設(shè)計(jì)
- java課程設(shè)計(jì)-聊天程序
- java抽獎(jiǎng)程序課程設(shè)計(jì)
- vb課程設(shè)計(jì)--打字練習(xí)應(yīng)用程序
- vb課程設(shè)計(jì)報(bào)告---打字程序設(shè)計(jì)報(bào)告
- vb課程設(shè)計(jì)報(bào)告---打字程序設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)聊天小程序
- 超市收銀程序java課程設(shè)計(jì)
- 打字練習(xí)課程設(shè)計(jì)報(bào)告(內(nèi)附源程序)
- VB課程設(shè)計(jì)報(bào)告---打字程序設(shè)計(jì)報(bào)告.doc
- 《java程序設(shè)計(jì)》課程設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)報(bào)告--聊天小程序
- java語言程序課程設(shè)計(jì)-- 坦克大戰(zhàn)
- 統(tǒng)計(jì)打字練習(xí)對(duì)錯(cuò)率的程序設(shè)計(jì)課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論