第一篇:Java課程設(shè)計(jì)報(bào)告
《Java課程實(shí)習(xí)》報(bào)告
題目 學(xué)號(hào) 學(xué)生姓名
音樂播放器
201011621335 201011621329 200811621320
朱劍峰 薛文博 劉彬
聯(lián)系方式 *** *** *** 所在專業(yè) 所在班級(jí) 指導(dǎo)教師 成績(jī) 教師簽字
計(jì)算機(jī)科學(xué)與技術(shù)
1103 劉思鳳
課程設(shè)計(jì)時(shí)間:2013年6月1日 至 2013年6月25日 評(píng)語:
廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告
目 錄
摘要......................................................................................................................................2 1 緒論..............................................................................................................................3 1.1 1.2 1.3 1.4 2 2.1 2.2 3 3.1 3.2 課題背景..............................................................................................................3 課程設(shè)計(jì)目的......................................................................................................3 課程設(shè)計(jì)實(shí)驗(yàn)環(huán)境..............................................................................................3 課程設(shè)計(jì)要求......................................................................................................4 程序界面布局設(shè)計(jì)..............................................................................................4 功能分析..............................................................................................................4 系統(tǒng)功能結(jié)構(gòu)圖..................................................................................................5 模塊功能設(shè)計(jì)......................................................................................................5 課程系統(tǒng)分析..............................................................................................................4
系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)..........................................................................................................5
3.2.1 “菜單欄”功能設(shè)計(jì)......................................................................................5 3.2.2 “動(dòng)態(tài)音頻播放進(jìn)度顯示”功能設(shè)計(jì)..........................................................9 3.2.3 “歌曲搜索”功能實(shí)現(xiàn)..................................................................................9 3.2.4 “歌曲播放/停止”功能實(shí)現(xiàn)......................................................................10 3.2.5 “列表展示”功能實(shí)現(xiàn)................................................................................11 4 系統(tǒng)優(yōu)點(diǎn)與缺點(diǎn)........................................................................................................13 4.1 4.2 5 系統(tǒng)優(yōu)點(diǎn)...............................................................................................................13 系統(tǒng)缺點(diǎn)...............................................................................................................13
系統(tǒng)開發(fā)過程............................................................................................................14 Myeclipse平臺(tái)開發(fā)版本...............................................................................................14 NetBeans開發(fā)平臺(tái)版本................................................................................................15 設(shè)計(jì)總結(jié)....................................................................................................................16
參考文獻(xiàn).............................................................................................................................17 附
錄.................................................................................................................................18 關(guān)鍵代碼..........................................................................................................................18
1、音樂解碼函數(shù)(decodeMusic)........................................................................18
2、播放線程類(class PlayThread).....................................................................20
3、控制滾動(dòng)條類(class RunSlider)...................................................................21
廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告
摘要
JAVA是目前最流行的軟件開發(fā)語言之一,稱為網(wǎng)絡(luò)上的“世界語”。JAVA適合開發(fā)基于多媒體、與平臺(tái)無關(guān)、用面向?qū)ο蟮姆椒ㄟM(jìn)行的基于Internet、Intranet、Extranet的Applet和應(yīng)用程序。它具有簡(jiǎn)單高效、面向?qū)ο蟆⒉灰蕾囉跈C(jī)器結(jié)構(gòu)的特點(diǎn),支持多線程、分布和并發(fā)機(jī)制。用JAVA開發(fā)的應(yīng)用軟件在可移植性、健壯性、安全性等方面大大優(yōu)于已存在的其他編程語言。
JAVA是一門包含多種知識(shí)的學(xué)科,提供了豐富的類庫,能最大限度地利用網(wǎng)絡(luò)。JAVA可廣泛用于面向?qū)ο蟮氖录枋觥⑻幚砻嫦驅(qū)ο蟮钠髽I(yè)型的應(yīng)用開發(fā),還應(yīng)用于Internet系統(tǒng)管理、Web頁面設(shè)計(jì)、Internet可視化軟件開發(fā)等方面。在學(xué)習(xí)的過程中我學(xué)到了許多以前沒有學(xué)到的概念和新鮮資訊。運(yùn)用這些知識(shí)可以完成老師交給我的課程設(shè)計(jì)任務(wù)。這次老師讓我們自己擬訂題目,給了我們很大的想象空間。我們自選了一個(gè)音樂播放器的課程設(shè)計(jì)題目。
本小組之所以選擇做音樂播放器,全賴于本小組成員均對(duì)音樂有濃厚的興趣,雖熱衷于聽音樂,但現(xiàn)在網(wǎng)上流傳的音樂播放器還不能滿足我們這些發(fā)燒友,像高清音樂等,這些高品質(zhì)的作品若在現(xiàn)流行的播放器上運(yùn)行,這只能做普通音樂文件“享用”。話說如此,因本小組開發(fā)能力有限,課程比較多,時(shí)間所限,以至?xí)呵野岩魳凡シ牌鏖_發(fā)到version0.9。主要功能還未能達(dá)到我們想要的境界。
小結(jié)一下,本小組的播放器所具備的功能有如下,添加音樂,刪除音樂,搜索音樂,更換播放器皮膚,更改播放模式等。(詳見2.2節(jié))
本次設(shè)計(jì)的播放器在具備基本功能的基礎(chǔ)上,還具有很強(qiáng)的擴(kuò)展性,如歌詞導(dǎo)入,可播放音樂類型的增加等等這些還未實(shí)現(xiàn)的地方我們都提供了許多接口,以便日后做修改或增加功能所用。
能夠具備一個(gè)屬于自己的播放器確實(shí)是一件非常高興的事情,能夠一邊開發(fā)一邊享受音樂的熏陶更是一件難得可貴的經(jīng)歷,愿此摘要能讓讀者感受得到筆者的興奮與成功。
廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告
音樂播放器
任務(wù)分工
系統(tǒng)設(shè)計(jì)與代碼實(shí)現(xiàn):朱劍峰 系統(tǒng)測(cè)試與維護(hù):薛文博 需求與功能分析:劉彬 指導(dǎo)教師:劉思鳳 緒論
1.1 課題背景
隨著社會(huì)電子音樂文件的與日俱增,作為現(xiàn)在最流行的音樂文件*.mp3,*.wav文件的數(shù)量和規(guī)模也在比以往的任何時(shí)候要多,不論是電臺(tái)DJ需要使用方便而有效地管理自己所使用的音樂文件,還是個(gè)人。在計(jì)算機(jī)日益普及的今天,若采用一套有效的音樂播放器。將自己所收藏的大量的音樂文件能隨時(shí)隨地的播放,這將方便于眾用戶聽音樂的需求。通過使用本音樂播放器能為音樂愛好者帶來意想不到的收獲。
1.2 課程設(shè)計(jì)目的
《應(yīng)用軟件開發(fā)實(shí)習(xí)》是計(jì)算機(jī)相關(guān)專業(yè)的必修專業(yè)基礎(chǔ)課程,其實(shí)踐性、應(yīng)用性很強(qiáng)。實(shí)踐教學(xué)環(huán)節(jié)是必不可少的一個(gè)重要環(huán)節(jié)。本課程的程序設(shè)計(jì)專題實(shí)際是計(jì)算機(jī)相關(guān)專業(yè)學(xué)生學(xué)習(xí)完《應(yīng)用軟件開發(fā)實(shí)習(xí)》課程后,進(jìn)行的一次全面的綜合訓(xùn)練,程序設(shè)計(jì)的設(shè)計(jì)目的是加深對(duì)理論教學(xué)內(nèi)容的理解和掌握,使學(xué)生較系統(tǒng)地掌握程序設(shè)計(jì)及其在網(wǎng)絡(luò)開發(fā)中的廣泛應(yīng)用,基本方法及技巧,為學(xué)生綜合運(yùn)用所學(xué)知識(shí),利用軟件工程為基礎(chǔ)進(jìn)行軟件開發(fā)、并在實(shí)踐應(yīng)用方面打下一定基礎(chǔ)。
1.3 課程設(shè)計(jì)實(shí)驗(yàn)環(huán)境
程序運(yùn)行在安裝有windows操作系統(tǒng)的計(jì)算機(jī)上(臺(tái)式機(jī)和筆記本),兼容windows 2K/XP/Vista/7/8 計(jì)算機(jī)硬件基本要求(僅供參考): 1.2.3.CPU:1G; 內(nèi)存:512M.; 顯卡:256M顯存;
文件播放:需要安裝有聲卡、要求安裝有語音庫。
JAVA程序設(shè)計(jì)語言及相應(yīng)的集成開發(fā)環(huán)境,Myeclipse和Netbeans開發(fā)工具。
廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告
1.4 課程設(shè)計(jì)要求
按課程設(shè)計(jì)指導(dǎo)書提供的課題,要求學(xué)生在自行完成各個(gè)操作環(huán)節(jié),并能實(shí)現(xiàn)且達(dá)到舉一反三的目的,完成一個(gè)項(xiàng)目解決一類問題。要求學(xué)生能夠全面、深入理解和熟練掌握所學(xué)內(nèi)容,并能夠用其分析、設(shè)計(jì)和解答類似問題;對(duì)此能夠較好地理解和掌握,能夠進(jìn)行簡(jiǎn)單分析和判斷;能編寫出具有良好風(fēng)格的程序;掌握J(rèn)AVA程序設(shè)計(jì)的基本技能和面向?qū)ο蟮母拍詈头椒ǎ涣私舛嗑€程、安全和網(wǎng)絡(luò)等編程技術(shù)。同時(shí)培養(yǎng)學(xué)生進(jìn)行分析問題、解決問題的能力;培養(yǎng)學(xué)生進(jìn)行設(shè)計(jì)分析、設(shè)計(jì)方法、設(shè)計(jì)操作與測(cè)試、設(shè)計(jì)過程的觀察、理解和歸納能力的提高。課程系統(tǒng)分析
2.1 程序界面布局設(shè)計(jì)
(1)創(chuàng)建一個(gè)JFrame類,類名為MyPlayer類。
(2)向?qū)υ捒蛑刑砑覬Slider控件、JList控件、JLabel控件、JJToggleButton控件、MenuBar菜單、JPanel容器、JToolBar容器以及JScrolPanel容器。
(3)設(shè)置所添加的控件的屬性,以及使用Java的界面風(fēng)格,本設(shè)計(jì)共使用了6種Java 的不同界面風(fēng)格。
2.2 功能分析
MyPlayer播放器主要對(duì)常用Windows音頻格式的文件實(shí)現(xiàn)播放控制: ? 主界面功能
? 菜單欄功能
? 添加音樂;
? 添加音樂文件(即導(dǎo)入一個(gè)或多個(gè)音樂文件至列表當(dāng)中); ? 添加音樂目錄(即導(dǎo)入文件夾中所有的音樂文件至列表當(dāng)中); ? 控制;
? 隨機(jī)播放; ? 順序播放; ? 單曲循環(huán);
? 設(shè)置歌詞(有待開發(fā)); ? 更換皮膚;
? 默認(rèn)、深海世界、迷人金屬、香韻咖啡、駭客帝國、浪漫滿屋(均為java的界面風(fēng)格)
? 關(guān)于;
廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告
? 幫助(記錄作者的相關(guān)信息以及軟件開發(fā)的日期);
? 動(dòng)態(tài)音頻播放進(jìn)度顯示;
? 正在播放歌曲在頂層的顯示
? 播放歌曲的時(shí)間長度的顯示以及正在播放時(shí)間的長度的顯示 ? 滾動(dòng)條隨播放狀態(tài)改變顯示 ? 歌曲搜索功能;
? 根據(jù)關(guān)鍵字搜索對(duì)應(yīng)的歌曲; ? 歌曲播放/停止功能;
? 上一首;(播放上一首歌曲并根據(jù)播放模式來選擇)? 下一首;(播放下一首歌曲并根據(jù)播放模式來選擇)? 播放/停止;(播放或停止歌曲)
? 雙擊播放/雙擊停止;(在列表中對(duì)指定歌曲的操作)? 列表展示功能;
? 隱藏/顯示列表; ? 移除單個(gè)音樂文件; ? 移除所有音樂文件;
? 顯示當(dāng)前歌曲數(shù)目,播放模式,皮膚情況; 系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
3.1 系統(tǒng)功能結(jié)構(gòu)圖
MyPlayer播放器的功能結(jié)構(gòu)圖如圖3-1。
主界面功能菜單欄功能動(dòng)態(tài)音頻播放進(jìn)度顯示歌曲搜索功能歌曲播放/停止功能列表展示功能
圖3-1 主界面功能圖
3.2 模塊功能設(shè)計(jì) 3.2.1 “菜單欄”功能設(shè)計(jì)
“菜單欄”功能結(jié)構(gòu)圖如圖3-2-1。
廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告
菜單欄功能添加音樂添加音樂文件添加音樂目錄控制更換皮膚關(guān)于隨機(jī)播放順序播放單曲循環(huán)種皮膚圖3-2-1菜單欄功能結(jié)構(gòu)
6幫助 3.2.1.1 “添加音樂”功能實(shí)現(xiàn)
當(dāng)點(diǎn)擊“添加歌曲/文件夾”選擇“添加本地歌曲”或“添加本地歌曲文件夾”的時(shí)候,這時(shí)候會(huì)觸發(fā)這兩個(gè)JMenuItem事件,調(diào)用了open()函數(shù)(opendir()函數(shù)),即將選中的音樂文件(或文件夾內(nèi)所有音樂文件)的信息(名稱與路徑)放入nameVector 和 urlVector 當(dāng)中。并修改listCount的值,顯示歌曲的總數(shù),最后將nameVector的所有內(nèi)容放入list列表當(dāng)中。如圖3-2-1-1。
圖3-2-1-1(左上)選擇操作,(左下)選擇目錄,(右下)列表顯示
廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告
3.2.1.2 “控制”功能實(shí)現(xiàn)
當(dāng)選擇“控制”功能的任意一項(xiàng),則會(huì)使全局的chosenMethod整型變量的值根據(jù)選擇的項(xiàng)賦對(duì)應(yīng)的值,值域?yàn)?(隨機(jī)播放)、2(順序播放)、3(單曲循環(huán))。因播放器的播放功能是一個(gè)while(true)的循環(huán),每當(dāng)播放歌曲時(shí)候,播放前會(huì)由函數(shù)chooseNextSong()根據(jù)chosenMethod的值來選擇下一首歌是那一首。
如果值是1,則會(huì)由[0,listCount(列表歌曲總數(shù))],獲取隨機(jī)數(shù),再根據(jù)play()函數(shù)播放;如果值是2,則根據(jù)chosenIndex(當(dāng)前播放歌曲號(hào)),直接加一,再根據(jù)play()函數(shù)播放;如果值是3,則chosenIndex(當(dāng)前播放歌曲號(hào))的值不再修改,再根據(jù)play()函數(shù)播放;如圖3-2-1-2。
圖3-2-1-2(左上)選擇操作;(左下)隨機(jī)播放后歌曲序號(hào),(此處為后臺(tái)顯示),起始播放第1首歌,下一首歌為第295首歌曲;(右側(cè))為列表顯示,指向?qū)?yīng)歌曲,并且列表底下顯示“隨機(jī)播放”
3.2.1.3 “更換皮膚”功能實(shí)現(xiàn)
當(dāng)選擇“更換皮膚”功能的任意一項(xiàng),則會(huì)觸發(fā)對(duì)應(yīng)事件的發(fā)生,調(diào)用函數(shù)loadskin1()或loadskin2()等等。此時(shí)會(huì)調(diào)用LookAndFeel的類,指定java包含的皮膚風(fēng)格。Loadskin1()對(duì)應(yīng)“默認(rèn)”,loadskin2()對(duì)應(yīng)“深海世界”等等。
選擇皮膚后,主界面底下會(huì)顯示對(duì)應(yīng)的提示,如選擇了“浪漫滿屋”,地下就會(huì)顯示 “皮膚:浪漫滿屋”。如圖3-2-1-3所示。
廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告
圖3-2-1-3
(左)選項(xiàng)顯示,(右)換膚后主
界面情況。
3.2.1.4 “關(guān)于”功能實(shí)現(xiàn)
當(dāng)選擇“幫助”功能時(shí),則彈出信息窗口,提示本軟件的開發(fā)時(shí)間與開發(fā)人員相關(guān)信息。如圖3-2-1-4所示。
圖3-2-1-4
廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告
3.2.2 “動(dòng)態(tài)音頻播放進(jìn)度顯示”功能設(shè)計(jì)
當(dāng)歌曲播放正在播放時(shí),則頂層“正在播放”處會(huì)顯示歌曲的名稱,當(dāng)歌曲名稱過長時(shí)候,超長部分會(huì)用省略號(hào)顯示。
同時(shí)會(huì)根據(jù)歌曲的格式,得到歌曲的長度,并顯示在歌曲的右側(cè)的JLabel fileTime中;另外會(huì)另起一個(gè)線程RunSlider來控制計(jì)時(shí)功能,每1秒鐘,滾動(dòng)條左側(cè)JLabel runningTime 會(huì)根據(jù)播放的時(shí)間來修改,滾動(dòng)條PlayerSlider則會(huì)每秒鐘根據(jù)runingTime的值來移動(dòng)。如圖3-2-2所示
圖3-2-2
正在播放歌曲中的動(dòng)態(tài)播放進(jìn)度顯示。
3.2.3 “歌曲搜索”功能實(shí)現(xiàn)
在搜索欄中輸入關(guān)鍵字,在回車確認(rèn),系統(tǒng)就會(huì)調(diào)用seachMusic()來搜索與關(guān)鍵字吻合的歌曲,并將其放入臨時(shí)的Vector tmpName當(dāng)中,并顯示其到list列表當(dāng)中。如圖3-2-3-1
在臨時(shí)的列表中選擇所需要播放的歌曲,雙擊播放,同時(shí)臨時(shí)列表消失,回復(fù)原來的列表,即導(dǎo)入nameVector的數(shù)據(jù)到list當(dāng)中。
當(dāng)點(diǎn)擊“X”按鈕,若還在臨時(shí)列表當(dāng)中,則會(huì)清除臨時(shí)列表并且恢復(fù)原來的列表;若已經(jīng)恢復(fù)到臨時(shí)列表,則搜索框中會(huì)返回提示“請(qǐng)輸入搜索關(guān)鍵字...”。
圖3-2-3-1(上)搜索“陳奕迅”的歌曲
(下)取消搜索后,搜索框的內(nèi)容
廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告
3.2.4 “歌曲播放/停止”功能實(shí)現(xiàn)
“歌曲播放/停止”功能結(jié)構(gòu)圖如圖3-2-4。
歌曲播放/停止功能上一首下一首播放/停止雙擊播放/停止
圖3-2-4 “歌曲播放/停止”功能結(jié)構(gòu)
3.2.4.1 “上一首”“下一首”功能實(shí)現(xiàn)
當(dāng)點(diǎn)擊“上一首”的按鈕時(shí),會(huì)根據(jù)按鈕事件,若chosenMethod(播放方式)的值為1(即隨機(jī)播放)則系統(tǒng)會(huì)調(diào)用chooseNextSong()來隨機(jī)選擇歌曲號(hào)來播放下一首歌;若chosenMethod不為1,則會(huì)調(diào)用previousMusic(),對(duì)chosenIndex(當(dāng)前播放歌曲號(hào))減一,再調(diào)用play()函數(shù)播放上一首歌曲。
當(dāng)點(diǎn)擊“下一首”的按鈕時(shí),會(huì)根據(jù)按鈕事件,若chosenMethod(播放方式)的值為1(即隨機(jī)播放)則系統(tǒng)會(huì)調(diào)用chooseNextSong()來隨機(jī)選擇歌曲號(hào)來播放下一首歌;若chosenMethod不為1,則會(huì)調(diào)用nextMusic(),對(duì)chosenIndex(當(dāng)前播放歌曲號(hào))加1,再調(diào)用play()函數(shù)播放下一首歌曲。
3.2.4.2 “播放/停止”“雙擊播放/停止”功能實(shí)現(xiàn)
當(dāng)點(diǎn)擊“播放/停止”的按鈕時(shí)候,若點(diǎn)擊了“播放”,則會(huì)顯示“停止”,同時(shí)會(huì)對(duì)列表正在選中的歌曲進(jìn)行播放。同時(shí)會(huì)觸發(fā)“動(dòng)態(tài)音頻播放進(jìn)度顯示”功能(3.2.2節(jié)所介紹),更改或增加播放信息;
若點(diǎn)擊了“停止”,則會(huì)顯示“播放”,同時(shí)會(huì)對(duì)當(dāng)前播放的歌曲進(jìn)行停止,同樣會(huì)觸發(fā)“動(dòng)態(tài)音頻播放進(jìn)度顯示”功能,清除對(duì)應(yīng)的顯示。如圖3-2-4-2
廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告
圖3-2-4-2(左)“播放”
(右)“停止”
3.2.5 “列表展示”功能實(shí)現(xiàn)
“列表展示”功能結(jié)構(gòu)圖如圖3-2-5。
列表展示功能隱藏/顯示列表移除音樂文件顯示列表信息
圖3-2-5 “列表展示”功能結(jié)構(gòu)
3.2.5.1 “隱藏/顯示列表”功能實(shí)現(xiàn)
當(dāng)點(diǎn)擊“顯示列表/隱藏列表”的按鈕時(shí)候,若點(diǎn)擊了“顯示列表”,則會(huì)顯示“隱藏列表”,同時(shí)觸發(fā)該事件,將原來的JFrame大框架的長度減少440個(gè)單位;
若點(diǎn)擊了“隱藏列表”,則會(huì)顯示“顯示列表”,同時(shí)觸發(fā)該事件,將原來的JFrame大框架的長度增加440個(gè)單位。
隱藏與顯示列表這一功能雖然非常簡(jiǎn)單,但其重要性不可忽視,對(duì)于現(xiàn)在許多用戶對(duì)音樂播放器的要求,就如自己的手機(jī)或著MP3一樣,小巧、靈活、精致,至此這一項(xiàng)功能對(duì)于本小組一開始的設(shè)計(jì)就算是一個(gè)亮點(diǎn)。如圖3-2-5-1所示。
廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告
圖3-2-5-1(左)隱藏列表,(右)顯示列表
3.2.5.2 “移除歌曲”功能文件實(shí)現(xiàn)
當(dāng)用鼠標(biāo)對(duì)著列表的音樂文件右鍵的時(shí)候,會(huì)彈出兩個(gè)選項(xiàng)“移除歌曲/移除所有歌曲”。
當(dāng)選擇“移除歌曲”,則對(duì)所選擇的音樂文件從列表中移除,即事件的觸發(fā)調(diào)用了deleteSingle()函數(shù),將對(duì)應(yīng)的項(xiàng)從列表中移除,從nameVector中移除,從urlVector中移除;
同理當(dāng)選擇“移除所有歌曲”的時(shí)候,事件觸發(fā)調(diào)用deleteAll()函數(shù),將列表清空,將nameVector中的元素清除。
以上兩者運(yùn)行過后均會(huì)更新主界面底層“歌曲數(shù)目”,并且停止正在播放的歌曲。
圖3-2-5-2右鍵列表后出現(xiàn)的選擇項(xiàng)
廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告
3.2.5.3 “顯示列表信息”功能實(shí)現(xiàn)
由“添加音樂”功能(3.2.1.1節(jié))調(diào)用的open()、opendir()函數(shù),會(huì)將保存在nameVector中的內(nèi)容導(dǎo)入列表當(dāng)中。當(dāng)雙擊列表中的歌曲的時(shí)候,如果歌曲正在播放則會(huì)停止,如果播放器沒有進(jìn)行播放,則雙擊后就進(jìn)行播放。
當(dāng)我們對(duì)著列表右鍵時(shí),則會(huì)彈出列表,“移除歌曲/移除所有歌曲”,詳見(3.2.5.2節(jié))系統(tǒng)優(yōu)點(diǎn)與缺點(diǎn)
4.1 系統(tǒng)優(yōu)點(diǎn)
1、windows界面風(fēng)格可選擇性,如上如所述,本音樂播放器具有6種皮膚可以更換。這大大滿足了一個(gè)娛樂性的軟件的需要,并且皮膚起名也符合用戶的感官需求,像“深海世界”、“浪漫滿屋”這些貼切而休閑的詞匯更能吸引用戶對(duì)播放器的使用。
2、播放方式可選擇性,對(duì)于喜歡聽音樂的用戶,會(huì)根據(jù)自己的需要選擇一定的順序來聽音樂。
3、列表隱藏的功能,符合大眾播放器的功能,將播放器的界面弄得小巧而精致,即使隱藏了列表也不妨礙主要的播放器功能。
4、搜索功能,隨著網(wǎng)絡(luò)的發(fā)達(dá),音樂歌曲隨處下載,人均播放列表的歌曲數(shù)目數(shù)以百計(jì),這時(shí)候搜索功能就顯得十分重要。本播放器根據(jù)關(guān)鍵字可以對(duì)列表進(jìn)行搜索,并可以顯示搜索后的列表,同時(shí)臨時(shí)的列表不會(huì)縮減播放器功能。
4.2 系統(tǒng)缺點(diǎn)
1、本系統(tǒng)主要代碼均在一個(gè)文件當(dāng)中MyPlayer.java當(dāng)中,由于本小組是用netBeans7.2.1開發(fā)平臺(tái)開發(fā)的,對(duì)開發(fā)平臺(tái)尚未了解,故暫且沒有將代碼弄得更具有可讀性。
2、本播放器還缺少暫停功能,在開發(fā)的最后版本(Music_Player0.9fornetBeans)還在改進(jìn)當(dāng)中。期待1.0版本對(duì)此功能的實(shí)現(xiàn)。
3、本播放器對(duì)音樂文件的選擇,僅僅.mp3文件以及.wav文件可播放。針對(duì)decodeMusic()解碼函數(shù)的改善,尚未能解決。
4、本播放器缺少歌詞設(shè)置、顯示功能。由于本小組對(duì)播放器的主界面還未想到一個(gè)滿意的設(shè)計(jì),所以歌詞的實(shí)現(xiàn)暫且沒有實(shí)現(xiàn),待界面設(shè)計(jì)得靈活的時(shí)候,再添加歌詞的功能。
廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告 系統(tǒng)開發(fā)過程
Myeclipse平臺(tái)開發(fā)版本
Version 0.1
1、菜單欄
*文件包括“打開文件”“打開目錄”“退出程序” *控制-隨機(jī)播放-順序播放-單曲循環(huán)-設(shè)置歌詞 *更換皮膚
*幫助-關(guān)于
2、上一首、下一首、停止/播放、隱藏列表4個(gè)button
3、幫助顯示-關(guān)于 消息框。
Version0.2
1、能打開文件,顯示文件名稱在下面的框內(nèi),多個(gè)文件顯示在框內(nèi)!
2、文件-退出程序
實(shí)現(xiàn)
3、能夠顯示列表與隱藏列表
Version0.3
1、雙擊能夠播放
2、暫停 跟 繼續(xù)
新增
1、雙擊整個(gè)title 換成為歌曲名稱 問題
1、隱藏列表/顯示列表 list 會(huì)縮水
2、filedialog 沒有選擇任何文件 直接關(guān)閉會(huì)出現(xiàn)錯(cuò)誤!(verson0.4中已解決)
3、雙擊空的列表也可以開始(version 0.6for netBeans 已經(jīng)解決)
Version0.31(Version0.3崩潰)
Version0.4
1、上一首,下一首 能夠在列表中顯示
2、上一首 下一首播放功能 新增:
1、打開文件可以多選
2、打開目錄 可以把整個(gè)目錄里面的MP3、wav文件導(dǎo)出在列表中。
問題:
1、雙擊 第一次 是開始,第二次 是停止(相對(duì)于同一首歌,相對(duì)于其它歌會(huì)停止,也不播放)(version 0.6for netBeans 已經(jīng)解決)
2、播放完一首歌后,不能自動(dòng)往下播放。(version 0.5forneatBeans 已經(jīng)解決)
歌曲不能刪除(version 0.6for netBeans 已經(jīng)解決)修改:
1、“打開文件”“打開目錄”分別換成 添加本地歌曲,添加本地歌曲文件夾
Version0.5
1、皮膚(簡(jiǎn)單的顏色或者圖片)
2、更換皮膚-可供選擇
修改:
1、項(xiàng)目已經(jīng)轉(zhuǎn)至netbeans平臺(tái)上開發(fā),并明明為Music_Player0.5forneatBeans 新增:
1、快捷鍵 添加歌曲/文件夾 添加了快捷鍵 和 關(guān)于 加了快捷鍵
廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告
Version 0.6
1、播放模式
2、刪除功能 問題:
1、播放列表可以拉出來,播放到名字比較長的歌曲,list會(huì)變寬!(已經(jīng)完全解決,刪
除正在播放的label)
2、播放按鈕,雙擊 未解決(version0.6已經(jīng)修復(fù)),上一首
下一首 置頂時(shí)候,以及
隨機(jī)播放時(shí)候 下一首上一首序號(hào)問題!(version0.6已經(jīng)修復(fù))。
3、菜單項(xiàng) 選中后,沒有特別標(biāo)志(解決辦法
1、換另外一種菜單項(xiàng)
2、選中菜單項(xiàng)后 字
體等改變)
selected 方法!是改變修改字體的!(version0.7添加1中 解決)
4、刪除 單首歌,序號(hào)不能改變(version0.7已經(jīng)修復(fù))NetBeans開發(fā)平臺(tái)版本
Version0.7 for netbeans
1、添加底下: 歌曲數(shù)目、播放模式、皮膚的顯示
2、歌曲名前面有序號(hào)
3、音樂時(shí)間,以及滾動(dòng)條
4、”正在播放“顯示的問題 Version0.8 for netbeans
1、添加搜索模塊
2、添加搜索功能
3、搜索功能->搜索列表播放功能 Version0.9fornetbeans
1、修改播放器軟件運(yùn)行時(shí)的圖標(biāo)(將java的圖標(biāo)換成“射手”圖標(biāo))
廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告 設(shè)計(jì)總結(jié)
JAVA是目前最流行的軟件開發(fā)語言之一,稱為網(wǎng)絡(luò)上的“世界語”。JAVA適合開發(fā)基于多媒體、與平臺(tái)無關(guān)、用面向?qū)ο蟮姆椒ㄟM(jìn)行的基于Internet、Intranet、Extranet的Applet和應(yīng)用程序。它具有簡(jiǎn)單高效、面向?qū)ο蟆⒉灰蕾囉跈C(jī)器結(jié)構(gòu)的特點(diǎn),支持多線程、分布和并發(fā)機(jī)制。用JAVA開發(fā)的應(yīng)用軟件在可移植性、健壯性、安全性等方面大大優(yōu)于已存在的其他編程語言。
JAVA是一門包含多種知識(shí)的學(xué)科,提供了豐富的類庫,能最大限度地利用網(wǎng)絡(luò)。JAVA可廣泛用于面向?qū)ο蟮氖录枋觥⑻幚砻嫦驅(qū)ο蟮钠髽I(yè)型的應(yīng)用開發(fā),還應(yīng)用于Internet系統(tǒng)管理、Web頁面設(shè)計(jì)、Internet可視化軟件開發(fā)等方面。在學(xué)習(xí)的過程中我學(xué)到了許多以前沒有學(xué)到的概念和新鮮資訊。運(yùn)用這些知識(shí)可以完成老師交給我的課程設(shè)計(jì)任務(wù)。這次老師讓我們自己擬訂題目,給了我們很大的想象空間。我們自選了一個(gè)音樂播放器的課程設(shè)計(jì)題目。
課程設(shè)計(jì)的過程雖然是艱難而辛苦的,但是我卻從中感到了快樂與欣慰。快樂是因?yàn)槲乙郧皩?duì)于JAVA的知識(shí)可以說是孤陋寡聞,但是通過這次課程設(shè)計(jì)我使自己的知識(shí)更加的豐富了,加大了自己的知識(shí)面。讓自己的實(shí)力擴(kuò)大了。所以我感到非常的快樂。欣慰是因?yàn)榭粗约鹤龀龅恼n程設(shè)計(jì)得到了老師的認(rèn)同,取得了成功。這次課程設(shè)計(jì)的整體過程是充實(shí)而滿足的。
廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告
參考文獻(xiàn)
[1](美)埃克爾(Eckel , B.)著,《Java編程思想》(第四版)陳昊鵬譯.一北京: 機(jī)械工業(yè)出版社,2007.6
[2] 刁成嘉 著,《UML系統(tǒng)建模與分析設(shè)計(jì)》,機(jī)械工業(yè)出版社,2007.6
[3] 朱喜福 著,《Java程序設(shè)計(jì)》(第2版),清華大學(xué)出版社, 2009.10
[4] 辛運(yùn)幃 著,《Java語言程序設(shè)計(jì)》(第1版),人民郵電出版社, 2009.10
[5] 葉核亞 著,《Java程序設(shè)計(jì)實(shí)用教程》(第3版),電子工業(yè)出版社,2010.2
[6] 耿祥義,張躍平編著,《Java面向?qū)ο蟪绦蛟O(shè)計(jì)》.一北京:清華大學(xué)出版社,2010.1
廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告
附
錄
關(guān)鍵代碼
1、音樂解碼函數(shù)(decodeMusic)
解析:由于java applet播放聲音,對(duì)應(yīng)的格式只有一些原始格式如.au、.Wav、.Midi、.rfm格式,因此一下的解碼函數(shù)就非常必要了,即將MP3等其它格式文件的音頻等格式修改成系統(tǒng)能夠?qū)崿F(xiàn)的格式,并寫入內(nèi)存由此來實(shí)現(xiàn)播放功能。詳細(xì)實(shí)現(xiàn)請(qǐng)閱讀如下代碼。
public void decodeMusic(AudioInputStream in){// 開始解碼 MP3
AudioFormat format = in.getFormat();
AudioFormat decodedFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,// 音頻編碼技術(shù)
format.getSampleRate(),// 每秒的樣本數(shù)
16,// 每個(gè)樣本中的位數(shù)
format.getChannels(),// 聲道數(shù)(單聲道 1 個(gè),立體聲 2 個(gè),等等)
format.getChannels()* 2,// 每幀中的字節(jié)數(shù)
format.getSampleRate(), false);// 每秒的幀數(shù)和是否以 big-endian // 字節(jié)順序存儲(chǔ)單個(gè)樣本中的數(shù)據(jù)
// 然后重新獲取一個(gè)新的輸入流,AudioInputStream decodeIn = AudioSystem.getAudioInputStream(decodedFormat, in);/**
* 源數(shù)據(jù)行是可以寫入數(shù)據(jù)的數(shù)據(jù)行。它充當(dāng)其混頻器的源。應(yīng)用程序?qū)⒁纛l字節(jié)寫入源數(shù)據(jù)行,這樣可處理字節(jié)緩沖并將它們傳遞給混頻器。
* 混頻器可以將這些樣本與取自其他源的樣本混合起來,然后將該混合物傳遞到輸出端口之類的目標(biāo)(它可表示聲卡上的音頻輸出設(shè)備)。
* */ SourceDataLine sdl = null;// 然后
DataLine.Info info = new DataLine.Info(SourceDataLine.class,decodedFormat);try {
/**
* AudioSystem :類充當(dāng)取樣音頻系統(tǒng)資源的入口點(diǎn)。此類允許查詢和訪問安裝在系統(tǒng)上的混頻器
* **/
sdl =(SourceDataLine)AudioSystem.getLine(info);
sdl.open(decodedFormat);
} catch(Exception e){
廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告
e.printStackTrace();} /** 指示該行是否支持特定類型的控件。*/ if(sdl.isControlSupported(FloatControl.Type.PAN)){
// FloatControl 對(duì)象提供對(duì)浮點(diǎn)值范圍的控制
FloatControl pan =(FloatControl)sdl
.getControl(FloatControl.Type.PAN);
if(curPosition == Position.RIGHT){
pan.setValue(1.0f);
} else if(curPosition == Position.LEFT){
pan.setValue(-1.0f);
} }
sdl.start();int nBytesRead = 0;byte[] abData = new byte[EXTERANAL_BUFFER_SIZE];try {
while(nBytesRead!=-1){
// 文件流的讀寫
nBytesRead = decodeIn.read(abData, 0, abData.length);
if(nBytesRead >= 0){
sdl.write(abData, 0, nBytesRead);
}
} } catch(Exception e){
e.printStackTrace();
return;} finally {
// 通過在清空數(shù)據(jù)行的內(nèi)部緩沖區(qū)之前繼續(xù)數(shù)據(jù) I/O,排空數(shù)據(jù)行中的列隊(duì)數(shù)據(jù)。
sdl.drain();
sdl.close();}
}
廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告
2、播放線程類(class PlayThread)
解析:本播放器只使用一個(gè)線程來實(shí)現(xiàn)歌曲播放的功能,若用戶要更換歌曲或者停止音樂,則對(duì)線程重建,即殺死原線程再建立新的線程,其實(shí)現(xiàn)的效果還是跟原來線程一樣。同時(shí)此線程包含了許多子功能,如更改播放模式,對(duì)“上一首”“下一首”顯示“正在播放”等功能均在此線程上實(shí)現(xiàn)。詳細(xì)內(nèi)容請(qǐng)閱讀如下代碼。
class PlayThread extends Thread{
public void run(){
while(true){
try {
setInitShowing();//初始化滾動(dòng)條以及計(jì)時(shí)label 的值
isStop = true;//標(biāo)志狀態(tài),說明是停止了
filename =(String)nameVector.get(chosenIndex).toString();//取chosenIndex對(duì)應(yīng)的歌曲名稱
filepath =(String)urlVector.get(chosenIndex).toString();////取chosenIndex對(duì)應(yīng)的歌曲路徑
System.out.println(“我在播放:”+chosenIndex+“ ”+filename);//后臺(tái)輸出檢測(cè)
/*設(shè)置“正在播放”的值,只輸出前23個(gè)字符,以免超出長度,后面補(bǔ)...*/
String showName = null;
if(filename.length()>23){
showName = filename.substring(0, 23)+ “..”;
}else{
showName = filename;
}
showTileOfMusic.setText(“正在播放:”+showName);
File file = new File(filepath);
setTitle(filename);
list.setSelectedValue(nameVector.get(chosenIndex), true);
listIndex = chosenIndex;
stporplySongButton.setText(“停止”);//修改 停止/播放button的狀態(tài)值
AudioInputStream in = AudioSystem.getAudioInputStream(file);//去音樂文件
AudioFileFormat aff = AudioSystem.getAudioFileFormat(file);//去音樂文件的格式(為了得到歌曲長度)
musicLength = aff.getFrameLength()/aff.getFormat().getFrameRate();//取音樂文件的長度
System.out.println(“我有那么長:”+musicLength);//后臺(tái)顯示,用于檢測(cè)
setShowingTime(musicLength,fileTime);//顯示總長度到fileTime label中
PlayerSlider.setMaximum((int)musicLength);//并且設(shè)置滾動(dòng)條的最大值
isStop = false;//設(shè)置正在播放狀態(tài)
hasStop = false;//設(shè)置正在播放狀態(tài)
decodeMusic(in);//解碼并播放
isStop = true;//播放完畢后設(shè)置回非播放狀態(tài)
hasStop = true;
廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告
chooseNextSong();//選擇下一首歌返回while
} catch(Exception e){
//e.printStackTrace();
System.out.println(“剛才那首歌出錯(cuò)了!”);//如果出現(xiàn)錯(cuò)誤,則顯示直接跳至下一首歌
nextMusic();
}
}
}
}
3、控制滾動(dòng)條類(class RunSlider)
解析:此類雖然簡(jiǎn)短,但其能動(dòng)態(tài)實(shí)現(xiàn)滾動(dòng)條以及播放時(shí)間的運(yùn)動(dòng)。其中setShowingTime()方法提供的接口十分靈活,能夠?qū)Σ煌臻g進(jìn)行時(shí)間的控制,本播放器只對(duì)播放時(shí)間的兩個(gè)JLabel實(shí)現(xiàn)了此功能,這大大提高了本播放器的可擴(kuò)展性。詳細(xì)內(nèi)容請(qǐng)閱讀如下代碼。
class RunSlider extends Thread{
public void run(){
try {
musicCouter = 0;
while(true){
Thread.sleep(1000);//每秒鐘滾動(dòng)一次
musicCouter++;
PlayerSlider.setValue((int)musicCouter);
setShowingTime(musicCouter, runingTime);//轉(zhuǎn)換時(shí)間并顯示回去runingTime label
}
} catch(InterruptedException ex){
Logger.getLogger(MyPlayer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
第二篇:Java課程設(shè)計(jì)報(bào)告
課 程 設(shè) 計(jì)
課程名稱 Java語言課程設(shè)計(jì) 題目名稱 人事管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn) 學(xué)生學(xué)院 應(yīng)用數(shù)學(xué)學(xué)院 專業(yè)班級(jí) 學(xué) 號(hào) 學(xué)生姓名 指導(dǎo)教師 劉科峰
2014 年 10 月 29
日 一.設(shè)計(jì)內(nèi)容
自學(xué)Swing圖形界面設(shè)計(jì)和數(shù)據(jù)庫程序設(shè)計(jì)。開發(fā)用于某單位的人事管理系統(tǒng)。該系統(tǒng)要求實(shí)現(xiàn)以下功能:
1.員工信息管理包括:?jiǎn)T工信息一覽表、新員工的建立、修改 2.薪資福利管理:考勤與薪資的連動(dòng)計(jì)算、薪資與福利的設(shè)置
3.考勤假期管理:考勤項(xiàng)目錄入, 實(shí)現(xiàn)考勤信息的查詢、統(tǒng)計(jì)、匯總 4.人事報(bào)表管理:按照員工性別,數(shù)目,薪酬自動(dòng)生成相關(guān)報(bào)表, 可自定義統(tǒng)計(jì)分析條件并可對(duì)歷史報(bào)表進(jìn)行管理。
設(shè)計(jì)亮點(diǎn)
1.null布局方式
Swing圖形界面設(shè)計(jì)中有很多布局方式,通過本次學(xué)習(xí)了解到了FlowLayout,BorderLayout,GridLayout以及null布局,就這四種布局方式而言,null布局的優(yōu)點(diǎn)在于可以將組建的位置精準(zhǔn)到坐標(biāo)值,可以把組件放到任意想放置的位置,另外可以通過null去設(shè)置組件的大小,相較于其他布局方式來說是一個(gè)很大的優(yōu)勢(shì)。但同時(shí)它的缺點(diǎn)在于不能根據(jù)Frame的大小變化而改變位置。
2.組件部分屬性的設(shè)計(jì)
Swing中有很多方法是用來實(shí)現(xiàn)組件屬性設(shè)置的,比如button.setVisible(false);按鈕通過調(diào)用這個(gè)方法實(shí)現(xiàn)不可見,這是我此次課程設(shè)計(jì)中的一個(gè)亮點(diǎn),因?yàn)榻M件是沒有設(shè)置大小的方法的,只有依靠于相應(yīng)的布局方式才能改變它的大小,通過設(shè)置多幾個(gè)按鈕設(shè)為不可見,將所要可見按鈕實(shí)現(xiàn)大小以及位置的控制是一種很好的方法。
二、設(shè)計(jì)方案
1主界面(只列出界面設(shè)計(jì)方面的代碼)
JPanel panel=new JPanel();JTable table=null;JButton ibtn=new JButton(“員工信息”);JButton cbtn=new JButton(“考勤管理”);JButton mbtn=new JButton(“薪資管理”);JButton tbtn=new JButton(“人事報(bào)表”);ImageIcon rtou = new ImageIcon(“rentou.jpg”);
JLabel imgLabel=new JLabel(rtou);
//上面代碼定義了一個(gè)面板與四個(gè)標(biāo)簽,并引入了一個(gè)圖片
panel.setLayout(new FlowLayout());//設(shè)置面板為流布局
panel.add(ibtn);panel.add(cbtn);panel.add(mbtn);panel.add(tbtn);panel.setBackground(Color.GRAY);
//將按鈕加到面板中,設(shè)置面板為灰色
this.add(imgLabel,BorderLayout.CENTER);this.add(panel,BorderLayout.SOUTH);this.setBounds(300, 180, 600, 350);this.setVisible(true);this.getContentPane().setBackground(Color.GRAY);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/*圖片標(biāo)簽以邊框布局放置在中間,將面板也以邊框布局放置在下面,可見,灰色,點(diǎn)擊關(guān)閉程序*/
(2)查詢員工界面(只列出界面設(shè)計(jì)方面的代碼)
Label idlabel = new JLabel(“ID”);JLabel namelabel = new JLabel(“姓名”);JLabel bumenlabel = new JLabel(“部門”);JLabel zhiweilabel = new JLabel(“職位”);
JTextField idfiled = new JTextField(8);JTextField namefield = new JTextField(8);JComboBox bumenbox =new JComboBox();JComboBox zhiweubox = new JComboBox();
JButton btn=new JButton(“查詢”);JButton ibtn=new JButton(“添加”)
JPanel spanel=new JPanel();JPanel vpanel=new JPanel();
/*定義和各個(gè)組件,4個(gè)標(biāo)簽,兩個(gè)文本框,兩個(gè)復(fù)選框,兩個(gè)按鈕,兩個(gè)面板容器*/ spanel.setLayout(new FlowLayout());
vpanel.setLayout(new FlowLayout(FlowLayout.CENTER,45,25));
bumenbox.addItem(“");
bumenbox.addItem(”管理部“);
bumenbox.addItem(”生產(chǎn)部“);
bumenbox.addItem(”業(yè)務(wù)部“);
zhiweubox.addItem(”“);
zhiweubox.addItem(”部長“);
zhiweubox.addItem(”副部長“);
zhiweubox.addItem(”普工“);
spanel.add(idlabel);
spanel.add(idfiled);
spanel.add(namelabel);
spanel.add(namefield);
spanel.add(bumenlabel);
spanel.add(bumenbox);
spanel.add(zhiweilabel);
spanel.add(zhiweubox);
spanel.add(btn);
vpanel.add(ibtn);
spanel.setBackground(Color.GRAY);
vpanel.setBackground(Color.GRAY);
//將各個(gè)組件放進(jìn)對(duì)應(yīng)面板,設(shè)置相關(guān)屬性
this.add(spanel,BorderLayout.NORTH);
this.add(vpanel,BorderLayout.SOUTH);
this.setBounds(300, 180, 600, 350);
this.setVisible(true);
this.getContentPane().setBackground(Color.GRAY);
//將面板以邊框布局放入框架中,設(shè)置屬性(3)增加員工信息界面
JPanel panel=new JPanel();
JLabel timeLabel=new JLabel(”時(shí)間“);JLabel allnumLabel=new JLabel(”員工總數(shù)“);
JLabel staffMoLabel=new JLabel(”考勤“);JLabel entryLabel=new JLabel(”全勤“);
JLabel quitLabel=new JLabel(”缺勤“);JLabel mwLabel=new JLabel(”性別比例“);
JLabel manLabel=new JLabel(”男“);
JLabel womanLabel=new JLabel(”女“);JLabel proportionLabel=new JLabel(”男女比例“);JLabel distributionLabel=new JLabel(”人員部門分布“);JLabel mdpLabel=new JLabel(”管理部“);
JLabel pdpLabel=new JLabel(”生產(chǎn)部“);JLabel bdpLabel=new JLabel(”業(yè)務(wù)部“);JLabel xmLabel=new JLabel(”項(xiàng)目“);JLabel xzLabel=new JLabel(”細(xì)則“);JLabel stLabel=new JLabel(”數(shù)據(jù)統(tǒng)計(jì)“);
JTextField timeFiled = new JTextField(8);
JTextField allnumFiled = new JTextField(8);JTextField entryFiled = new JTextField(8);JTextField quitFiled = new JTextField(8);JTextField manFiled = new JTextField(8);JTextField womanFiled = new JTextField(8);JTextField proportionFiled = new JTextField(8);JTextField mdpFiled = new JTextField(8);JTextField pdpFiled = new JTextField(8);JTextField bdpFiled = new JTextField(8);// 定義所需組件
public Selectrenshi(String tablename){
super(”人事管理“);
panel.setLayout(null);
panel.setBackground(Color.GRAY);
panel.add(xmLabel);
panel.add(xzLabel);
panel.add(stLabel);
panel.add(timeLabel);
panel.add(timeFiled);
panel.add(allnumLabel);
panel.add(allnumFiled);
panel.add(staffMoLabel);
panel.add(entryLabel);
panel.add(entryFiled);
panel.add(quitLabel);
panel.add(quitFiled);
panel.add(mwLabel);
panel.add(manLabel);
panel.add(manFiled);
panel.add(womanLabel);
panel.add(womanFiled);
panel.add(proportionLabel);
panel.add(proportionFiled);
panel.add(distributionLabel);
panel.add(mdpLabel);
panel.add(mdpFiled);
panel.add(pdpLabel);
panel.add(pdpFiled);
panel.add(bdpLabel);
panel.add(bdpFiled);
//將組件加到相應(yīng)面板中
xmLabel.setBounds(120,20,100,30);
xzLabel.setBounds(240,20,100,30);
stLabel.setBounds(360,20,100,30);
timeLabel.setBounds(120,50,100,30);
timeFiled.setBounds(360,50,100,30);
allnumLabel.setBounds(120,100,100,30);
allnumFiled.setBounds(360,100,100,30);
staffMoLabel.setBounds(120,150,100,30);
entryLabel.setBounds(240,150,100,30);
entryFiled.setBounds(360,150,100,30);
quitLabel.setBounds(240,200,100,30);
quitFiled.setBounds(360,200,100,30);
mwLabel.setBounds(120,250,100,30);
manLabel.setBounds(240,250,100,30);
manFiled.setBounds(360,250,100,30);
womanLabel.setBounds(240,300,100,30);
womanFiled.setBounds(360,300,100,30);
proportionLabel.setBounds(240,350,100,30);
proportionFiled.setBounds(360,350,100,30);
distributionLabel.setBounds(120,400,100,30);
mdpLabel.setBounds(240,400,100,30);
mdpFiled.setBounds(360,400,100,30);
pdpLabel.setBounds(240,450,100,30);
pdpFiled.setBounds(360,450,100,30);
bdpLabel.setBounds(240,500,100,30);
bdpFiled.setBounds(360,500,100,30);
//采用null布局,設(shè)置組建坐標(biāo)值
this.add(panel,BorderLayout.CENTER);
this.setBounds(300, 100, 600, 600);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.getContentPane().setBackground(Color.GRAY);
//將面板放入框架,設(shè)置相應(yīng)屬性(4)員工考勤界面
JLabel idlabel = new JLabel(”ID“);JComboBox idbox =new JComboBox();CheckTable model = null;
JButton wbtn=new JButton(”修改“);
JButton cbtn=new JButton(”查詢“);JButton mbtn=new JButton(”創(chuàng)建薪資表“);JButton rbtn=new JButton(”創(chuàng)建人事表“);
JScrollPane scrollpane = null;JPanel spanel=new JPanel();JPanel vpanel=new JPanel();JTable table=null;spanel.add(idbox);panel.add(wbtn);spanel.add(cbtn);vpanel.add(mbtn);vpanel.add(rbtn);spanel.setBackground(Color.GRAY);vpanel.setBackground(Color.GRAY);this.add(spanel,BorderLayout.NORTH);this.add(vpanel,BorderLayout.SOUTH);this.setBounds(300, 180, 600, 350);this.setVisible(true);this.getContentPane().setBackground(Color.GRAY);
(5)選擇考勤表界面
JLabel checklabel = new JLabel(”選擇考勤表“);JLabel newlabel = new JLabel(”創(chuàng)建考勤表“);JComboBox timebox =new JComboBox();JTextField newfield = new JTextField();JButton btn=new JButton(”確認(rèn)“);JButton nbtn=new JButton(”創(chuàng)建");JPanel spanel=new JPanel();spanel.add(checklabel);
spanel.add(timebox);
spanel.add(btn);
spanel.add(newlabel);
spanel.add(newfield);
spanel.add(nbtn);
checklabel.setBounds(30,90,100,30);
timebox.setBounds(180,90,100,30);
btn.setBounds(360,90,100,30);
newlabel.setBounds(30,200,100,30);
newfield.setBounds(180,200,100,30);
nbtn.setBounds(360,200,100,30);
this.add(spanel);
this.setBounds(300, 180, 600, 350);
this.setVisible(true);
三、結(jié)果和數(shù)據(jù)處理
四、結(jié)論
1.Swing圖形界面
圖形用戶界面(GUI)是程序不可或缺的一部分,它便于用戶和程序的交互。在Swing界面中是以Frame為框架,采用合理的布局方式(FlowLayout,BorderLayout,GridLayout,null),將Panel加入框架之中,而實(shí)現(xiàn)界面的各個(gè)組件將調(diào)用各種方法設(shè)置自身屬性實(shí)行可視化界面以及加入到面板之中。再通過事件監(jiān)聽器實(shí)現(xiàn)事件的監(jiān)聽預(yù)處理機(jī)制。
2.數(shù)據(jù)庫
在這次課程設(shè)計(jì)中哦我主要負(fù)責(zé)Swing圖像界面,對(duì)于數(shù)據(jù)庫只做了最簡(jiǎn)單的了解。程序中采用了最流行的關(guān)系型數(shù)據(jù)庫mysql,雪化了mysql的建立,刪除,與修改以及使用sql語言對(duì)數(shù)據(jù)庫進(jìn)行一些簡(jiǎn)單的操作,將按鈕等設(shè)置的監(jiān)聽事件與數(shù)據(jù)庫相連接。
五、問題與討論
1.組件的方法調(diào)用
在這次課程設(shè)計(jì)中,用到了很多的組件,例如Button,Jlabel,TextField,ComBox,等。Swing圖形界面也確實(shí)提供了很多方法去設(shè)置相關(guān)組件的屬性,例如label.setVisible(false);設(shè)置標(biāo)簽不可見等很多方法,只要查看API文檔幾乎就能實(shí)現(xiàn)很多功能,但是對(duì)于按鈕等最常見的組件來說設(shè)置大小如果不依靠相關(guān)布局方式很難設(shè)置,我在程序中之所以運(yùn)用了很多的bull布局方式就是為了實(shí)現(xiàn)組件大小的設(shè)置,如果說能有一個(gè)方法直接設(shè)置組件大小而不受其他組件或容器影響就能使代碼很簡(jiǎn)潔了。2.相對(duì)布局
在編寫圖像界面的程序的時(shí)候,我用了很多的布局方式,有FlowLayout,BorderLayout,GrirLayout,null等,其中null布局用的最多。null布局的優(yōu)點(diǎn)在于可以將組建的位置精準(zhǔn)到坐標(biāo)值,可以把組件放到任意想放置的位置,另外可以通過null去設(shè)置組件的大小,相較于其他布局方式來說是一個(gè)很大的優(yōu)勢(shì)。但同時(shí)它的缺點(diǎn)在于不能根據(jù)Frame的大小變化而改變位置。其他三種布局方式雖然實(shí)現(xiàn)了歲Frame大小變動(dòng)而改變組件大小及位置但是不容易控制,如果null布局能實(shí)現(xiàn)相對(duì)布局就是很好的一種布局方式了。
第三篇:java聊天室課程設(shè)計(jì)報(bào)告
課程設(shè)計(jì)報(bào)告
2011 ~ 2012 學(xué)年 第 一 學(xué)期
學(xué) 號(hào) 20104053020 姓 名 胡勇昌 院 系 信息工程與技術(shù) 專 業(yè) 計(jì)算機(jī)工程系 課 程 名 稱 JAVA程序設(shè)計(jì) 課程設(shè)計(jì)名稱 局域網(wǎng)內(nèi)的多功能聊天室
學(xué) 時(shí) 學(xué) 分 1 指 導(dǎo) 教 師 許爍娜
2011年 12 月 25 日
目錄
課程設(shè)計(jì)報(bào)告..........................................................................................................................................1 第1章 引言............................................................................................................................................3 1.1 背景...............................................................................................................................................3 1.2 相關(guān)技術(shù).......................................................................................................................................3 1.2.1 JAVA概述...............................................................................................................................3 1.2.2 Socket......................................................................................................................................3 1.2.3 TCP 三次握手.....................................................................................................................4 1.3 術(shù)語...............................................................................................................................................4 第2章 需求分析與系統(tǒng)設(shè)計(jì)................................................................................................................5 2.1 需求分析.......................................................................................................................................5 2.2 系統(tǒng)設(shè)計(jì).......................................................................................................................................6 2.2.1多用戶在線方案.....................................................................................................................6 2.2.2 系統(tǒng)功能................................................................................................................................6 第3章 系統(tǒng)實(shí)施....................................................................................................................................6 3.1聊天室窗口....................................................................................................................................6 3.2 建立客戶端窗口...........................................................................................................................8 3.3 內(nèi)嵌“私聊”窗口.......................................................................................................................9 3.4客服端類繼承客戶端窗口類,并內(nèi)嵌私聊程序......................................................................10 第4章 測(cè)試..........................................................................................................................................15 4.1 測(cè)試環(huán)境與使用方法.................................................................................................................15 4.2 功能測(cè)試.....................................................................................................................................15 4.2.1聊天室窗口...........................................................................................................................15 4.2.2 客戶端窗口..........................................................................................................................16
4.2.3 內(nèi)嵌“私聊”窗口..........................................................................................................................16
參考文獻(xiàn)................................................................................................................................................16
第1章 引言
1.1 背景
網(wǎng)絡(luò)聊天室通常直稱聊天室,是一種人們可以在線交談的網(wǎng)絡(luò)論壇,在同一聊天室的人們通過廣播消息進(jìn)行實(shí)時(shí)交談。聊天室可以建立在即時(shí)通訊軟件(如MSN Messenger、QQ)、P2P軟件、萬維網(wǎng)(如 Halapo,Meebo)等基礎(chǔ)上,萬維網(wǎng)方式更為普通和種類繁多,交談的手段不局限于文本,更包括語音、視頻。通常聊天室是按照房間或頻道為單位的,在同一房間或頻道的網(wǎng)人可以實(shí)時(shí)地廣播和閱讀公開消息。一般情況下,與其它網(wǎng)絡(luò)論壇、即時(shí)通訊不同的是,聊天室不保存聊天記錄。
1.2 相關(guān)技術(shù) 1.2.1 JAVA概述
Java是一種可以撰寫跨平臺(tái)應(yīng)用軟件的面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,是由Sun Microsystems公司于1995年5月推出的Java程序設(shè)計(jì)語言和java平臺(tái)(即JavaSE, JavaEE, JavaME)的總稱。Java 技術(shù)具有卓越的通用性、高效性、平臺(tái)移植性和安全性,廣泛應(yīng)用于個(gè)人PC、數(shù)據(jù)中心、游戲控制臺(tái)、科學(xué)超級(jí)計(jì)算機(jī)、移動(dòng)電話和互聯(lián)網(wǎng),同時(shí)擁有全球最大的開發(fā)者專業(yè)社群。在全球云計(jì)算和移動(dòng)互聯(lián)網(wǎng)的產(chǎn)業(yè)環(huán)境下,Java更具備了顯著優(yōu)勢(shì)和廣闊前景。
1.2.2 Socket Socket是java中需一要編寫較低層次的網(wǎng)絡(luò)通信程序(例如Cljent/server應(yīng)用程序)時(shí)提供的一種通訊機(jī)制。Socket是兩個(gè)程序進(jìn)行雙向數(shù)據(jù)傳輸?shù)木W(wǎng)絡(luò)通信的端點(diǎn),一般 由一個(gè)地址加上一個(gè)端口號(hào)來標(biāo)一識(shí)。每個(gè)服務(wù)程序都在一個(gè)眾所周知的端口上提供服 務(wù),而想使用服務(wù)的客戶端程序則需要連接該端口。通過Socket的數(shù)據(jù)是原始字節(jié)流信 息,通信雙方必須根據(jù)約定的協(xié)議對(duì)數(shù)據(jù)進(jìn)行處理與解釋。
Socket通信機(jī)制提供了兩種通信.方式:有連接方式(TCP)和無連接方式(UDP數(shù)
據(jù)報(bào))。有連接方式中,通信雙方在開始時(shí)必須進(jìn)行一次連接過程,建立一條通信鏈路。通信鏈路提供了可靠的,全雙工的字節(jié)流服務(wù)。無連接力一式中,通信雙方不存在一個(gè)連 接過程,一次網(wǎng)絡(luò)I/O以一個(gè)數(shù)據(jù)報(bào)形式進(jìn)行,而每次網(wǎng)絡(luò)I /O可以和不同.主機(jī)的不 同進(jìn)程進(jìn)行。無連接方式開銷小于有連接方式,但是所提供的數(shù)據(jù)傳輸服務(wù)不可靠,不 能保證數(shù)據(jù)報(bào)一定到達(dá)目的地”」·。
JAVA的有連接通信采用流式I/O模式。Socket是兩個(gè)進(jìn)程間通信鏈的端點(diǎn),每個(gè) Sockct有兩個(gè)流:一個(gè)輸入流和一個(gè)輸出流。只要向Sockct的輸出流寫,一個(gè)進(jìn)程就可 以通過網(wǎng)絡(luò)連接向其他進(jìn)程發(fā)送數(shù)據(jù);同樣,通過讀Sockt的輸入流,就可以讀取傳輸 來的數(shù)據(jù)。
有連接通信一般要經(jīng)歷以下四個(gè)基本步驟ii
(1)創(chuàng)建Sockct,建立連接;
(2)打開連接到Sockct的輸入/輸出流;
(3)按照一定的一腳議對(duì)Socket進(jìn)行讀/寫操作;
(4)關(guān)閉Socket。
第(3)步是程序員用來調(diào)用Socket和實(shí)現(xiàn)程序功能的關(guān)鍵步驟,其他三步在各種 程序中基本相同。
1.2.3 TCP 三次握手
TCP協(xié)議通過三個(gè)報(bào)文段完成連接的建立,這個(gè)過程稱為三次握手(three-way handshake),過程如下圖所示。
1.3 術(shù)語
暫無
第2章 需求分析與系統(tǒng)設(shè)計(jì)
2.1 需求分析
從技術(shù)發(fā)面來看,Java語言的優(yōu)點(diǎn)一要表現(xiàn)在:簡(jiǎn).單、面向?qū)ο蟆⒍嗑€程、安全性 等方面。1.簡(jiǎn)單性
Java與C++語言灰常相近,但Java比C++簡(jiǎn)單,它拋棄了C++中的一些不是絕對(duì) 必要的功能,如頭文件、頂處理文件、指針、結(jié)構(gòu)、運(yùn)算符重載、多重繼承以及自動(dòng)強(qiáng)迫同型。Java實(shí)現(xiàn)了自動(dòng)的垃圾收集,簡(jiǎn)化了內(nèi)存管理的一作。這使程序一設(shè)計(jì)更加簡(jiǎn)便,同時(shí)減少了出錯(cuò)的可能。2.面向?qū)ο?/p>
Java提供了簡(jiǎn)單的類機(jī)制和動(dòng)態(tài)的構(gòu)架模型。對(duì)象中封裝了它的狀態(tài)變量和方法,很好地實(shí)現(xiàn)了模塊化和信息隱藏;而類則提供了一類對(duì)象的原型,通過繼承和重載機(jī)制,子類可以使用或重新定義父類或超類所提供的一方法,從而既實(shí)現(xiàn)了代碼的復(fù)用,又提供了一種動(dòng)態(tài)的解決方案。
Java是一種完全面向?qū)ο蟮某绦蛟O(shè)計(jì)語一言,它除了數(shù)組、布爾和字符二個(gè)基本數(shù)據(jù)類型外的其它類都是對(duì)象,它不再支持全局變量。在Java中,如果不創(chuàng)建新類就無法創(chuàng)建程序,Java程序在運(yùn)行時(shí)必須先創(chuàng)建一個(gè)類的實(shí)例,然后才能提交運(yùn)行。
Java同樣支持繼承特性,Java的類可以從其它類中繼承行為,但Java只支持類的 單重繼承,即每個(gè)類只能從一個(gè)類中繼承。
Java支持界面,界面允許程序員定義方法但又不立即實(shí)現(xiàn),一個(gè)類可以實(shí)現(xiàn)多個(gè)界面,利用界面可以得到多重繼承的許多優(yōu)點(diǎn)而又沒有多重繼承的問題。3.多線程
多線程使應(yīng)用程序可以同時(shí)進(jìn)行不同的操作,處理不同的事件。在多線程機(jī)制中,不同的線程處理不同的任務(wù),他們之間互不干涉,不會(huì)由于一處等待影響其他部分,這樣容.易實(shí)現(xiàn)網(wǎng)絡(luò)上的實(shí)時(shí)交互操作。
Java程序可以有多個(gè)執(zhí)行線程,如可以讓一個(gè)線程進(jìn)行復(fù)雜的計(jì)算,而讓另一個(gè)線 程與用戶進(jìn)行交互,這樣用戶可以在不中斷計(jì)算線程的前提下與系統(tǒng)進(jìn)行交互。多線程保證了較高的執(zhí)行效率。4.安全性
Java不支持指針,一切對(duì)內(nèi)存的訪問都必須通過對(duì)象的實(shí)例變量來實(shí)現(xiàn),這樣就防止了程序員使用欺騙手段訪問對(duì)象的私有成員,同時(shí)也避免了指針操作中容易產(chǎn)生的錯(cuò)誤。2.2 系統(tǒng)設(shè)計(jì) 2.2.1多用戶在線方案 2.2.2 系統(tǒng)功能
聊天室程序通常需要完成以下一些基本功能:
(I)登錄聊天室;
(2)啟動(dòng)服務(wù)器;
(3)關(guān)閉服務(wù)器;
(4)用戶之間的聊天;
(5)退出聊天室。
本系統(tǒng)其體功能需求如下:
(1)聊天室管理員經(jīng)登錄界面登錄到管理界而,即系統(tǒng)的服務(wù)器端。用戶經(jīng)登錄界而 都進(jìn)入聊天大廳。
(2)不論是管理員還是用戶都需一要在登錄界面輸入正確的用戶名和密碼后才可以登錄 到各自的界面中去。
(3)系統(tǒng)的兩個(gè)主要界面都是為方便管理員和用戶操作的。首先,管理員進(jìn)入到管理 界而后可以方便的啟動(dòng)/停止服務(wù)器,看到在線用戶的信息和聊人信息、。用戶進(jìn)入到聊天 大廳中可以聊天,查看服務(wù)器狀態(tài)。
(4)一個(gè)用戶退出聊天室對(duì)其他用戶不能產(chǎn)生影響,而服務(wù)器斷開與客戶端的連接則所有的用戶都失去與服務(wù)器的連接。
(5)用戶的聊天信息錄入,重寫,發(fā)送,接收方便,快捷。
(6)服務(wù)器狀態(tài),聊天信息和在線用戶人數(shù)及時(shí)刷新。
(7)聊天室系統(tǒng)運(yùn)行穩(wěn)定、安全性高、性能可靠。
第3章 系統(tǒng)實(shí)施
3.1聊天室窗口
建立服務(wù)端窗口類:窗口程序如下 import java.awt.Button;import java.awt.Color;import java.awt.FlowLayout;import java.awt.List;import java.awt.TextArea;
import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JScrollPane;import javax.swing.JTextField;
public class chatroomW { JFrame f=new JFrame(“局域網(wǎng)聊天室”);JLabel label1=new JLabel(“端口”);JLabel label2=new JLabel(“發(fā)送”);Button button1=new Button(“啟動(dòng)服務(wù)”);Button button2=new Button(“發(fā)送”);Button button3=new Button(“刷新用戶列表”);JTextField text1=new JTextField(5);JTextField text2=new JTextField(25);TextArea area1=new TextArea(26,84);List userList=new List(27);JScrollPane scro1,scro2;public chatroomW(){
chat();} public void chat(){
area1.setBackground(new Color(204,255,255));
area1.setForeground(Color.black);
userList.setBackground(Color.gray);
userList.setForeground(Color.white);
f.setLayout(new FlowLayout());f.add(area1);f.add(userList);f.add(label1);f.add(text1);f.add(button1);f.add(text2);f.add(button2);f.add(button3);
f.setBounds(300,200,750,485);
f.setResizable(false);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
area1.setEditable(false);text1.setText(“10000”);
myEvent();
} public static void main(String args[]){
new chatroomW();} public void myEvent(){} }
3.2 建立客戶端窗口
import java.awt.Color;import java.awt.FlowLayout;import java.awt.TextArea;
import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JScrollPane;import javax.swing.JTextField;
public class ClientW {
JFrame f=new JFrame(“聊天室”);JScrollPane js;TextArea area=new TextArea(19,67);JTextField text1=new JTextField(12);JTextField text2=new JTextField(5);JTextField text3=new JTextField(5);JTextField text4=new JTextField(20);JButton button1=new JButton(“連接”);JButton button2=new JButton(“發(fā)送”);JButton button3=new JButton(“私聊”);JLabel label1=new JLabel(“服務(wù)器地址”);JLabel label2=new JLabel(“服務(wù)器端口”);JLabel label3=new JLabel(“昵稱”);public ClientW(){ } public void chat(){
area.setBackground(new Color(204,255,255));area.setForeground(Color.black);f.setLayout(new FlowLayout());f.setBounds(300,200,500,410);f.add(label1);f.add(text1);f.add(label2);chat();//
}
} f.add(text2);f.add(button1);f.add(area);f.add(label3);f.add(text3);f.add(text4);f.add(button2);f.add(button3);f.setVisible(true);f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);f.setResizable(false);area.setEditable(false);text2.setText(“10000”);text4.setText(null);myEvent();public void myEvent(){} public static void main(String args[]){ } new ClientW();
3.3 內(nèi)嵌“私聊”窗口
class netchat{ JFrame f=new JFrame(“私聊”);JLabel label1,label2,label3;Button button1,button2;JTextField text1,text2,text3,text4;TextArea textarea;
f.setLayout(new FlowLayout());f.setBounds(300,200,400,310);//設(shè)置窗口大小和位置; label1=new JLabel(“對(duì)方主機(jī)”);label2=new JLabel(“本地端口”);label3=new JLabel(“對(duì)方端口”);button1=new Button(“連接”);button2=new Button(“發(fā)送”);text1=new JTextField(7);text2=new JTextField(3);text3=new JTextField(3);public netchat(){ f.setResizable(false);//讓窗口大小固定;
// 閉;
} text4=new JTextField(20);textarea=new TextArea(13,53);textarea.setEditable(false);textarea.setBackground(new Color(204,250,255));f.add(label1);f.add(text1);f.add(label2);f.add(text2);f.add(label3);f.add(text3);f.add(button1);f.add(textarea);f.add(text4);f.add(button2);f.setVisible(true);f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);//關(guān)閉窗口程序同時(shí)關(guān)myEvent();
3.4客服端類繼承客戶端窗口類,并內(nèi)嵌私聊程序
import java.awt.Button;import java.awt.Color;import java.awt.FlowLayout;import java.awt.TextArea;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintStream;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.Socket;
import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JTextField;
public class Client extends ClientW{ Socket s=null;public Client(){} public void myEvent(){
button1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
try{
s=new Socket(text1.getText().toString(),Integer.parseInt(text2.getText()));
new Thread(new LinkC()).start();
area.append(“[系統(tǒng)消息]:連接成功n”);
}catch(Exception ex){area.append(“[系統(tǒng)消息]:連接失敗n”);}
}
});
button2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
new SentC();
}
});
button3.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
new netchat();
}
});} public static void main(String args[]){
new Client();}
class LinkC implements Runnable{
public void run(){
try{
BufferedReader bufIn=
new BufferedReader(new InputStreamReader(s.getInputStream()));
String msg=null;
PrintStream ps=new PrintStream(s.getOutputStream());
ps.println(text3.getText());
while(true){
try{
while((msg=bufIn.readLine())!=null){
area.append(msg+“n”);
}
}catch(Exception ex){break;}
}
}catch(Exception e){}
}
}
class SentC {
public SentC(){
try{
PrintStream ps=new PrintStream(s.getOutputStream());
if(!text4.getText().equals(“")){
ps.println(text4.getText());//
area.append(text4.getText());//服務(wù)器自動(dòng)會(huì)返回
text4.setText(”“);
}
}catch(Exception e){}
}
} //私聊類
class netchat{
JFrame f=new JFrame(”私聊“);
JLabel label1,label2,label3;
Button button1,button2;
JTextField text1,text2,text3,text4;
TextArea textarea;
public netchat(){
f.setLayout(new FlowLayout());
f.setBounds(300,200,400,310);
//設(shè)置窗口大小和位置;
f.setResizable(false);
//讓窗口大小固定;
label1=new JLabel(”對(duì)方主機(jī)“);
label2=new JLabel(”本地端口“);
label3=new JLabel(”對(duì)方端口“);
button1=new Button(”連接“);
button2=new Button(”發(fā)送“);
text1=new JTextField(7);
text2=new JTextField(3);
text3=new JTextField(3);
text4=new JTextField(20);
textarea=new TextArea(13,53);
textarea.setEditable(false);
textarea.setBackground(new Color(204,250,255));
text2.setText(”10000“);
text3.setText(”10000“);
f.add(label1);
f.add(text1);
f.add(label2);
f.add(text2);
f.add(label3);
f.add(text3);
f.add(button1);
f.add(textarea);
f.add(text4);
f.add(button2);
f.setVisible(true);//
f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);//關(guān)閉窗口程序同時(shí)關(guān)閉;
myEvent();
}
public void myEvent(){
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e){
try{
DatagramSocket ds=new DatagramSocket();
byte[] buf=”對(duì)方已下線“.getBytes();
DatagramPacket dp=
new DatagramPacket(buf,buf.length,InetAddress.getByName(text1.getText()),Integer.parseInt(text3.getText()));
ds.send(dp);
ds.close();
}catch(Exception ex){}
}
});
button2.addActionListener(new ActionListener()//事件源是button2
{
public void actionPerformed(ActionEvent e)
{
if(!text4.getText().equals(”“))
new Thread(new Send()).start();
}
});
button1.addActionListener(new ActionListener()//事件源是button1
{
public void actionPerformed(ActionEvent e)
{
new Thread(new Rece()).start();
}
});
}
class Send implements Runnable{
public void run(){ try{UdpSend();}catch(Exception e){textarea.append(”[系統(tǒng)消息]:發(fā)送失敗n“);}}
public void UdpSend()throws Exception{
DatagramSocket ds=new DatagramSocket();
byte[] buf=text4.getText().getBytes();
DatagramPacket dp=
new DatagramPacket(buf,buf.length,InetAddress.getByName(text1.getText()),Integer.parseInt(text3.getText()));
textarea.append(”[我]: “+text4.getText()+”n“);
text4.setText(”“);
ds.send(dp);
ds.close();
}
}
class Rece implements Runnable{
int index=0;
public void run(){
try{
UdpRece();
}catch(Exception e){
textarea.append(”[系統(tǒng)消息]:連接失敗n“);
}
}
public void UdpRece()throws Exception{
while(true){
DatagramSocket ds=new DatagramSocket(Integer.parseInt(text2.getText()));
if(index==0){textarea.append(”[系統(tǒng)消息]:連接成功n“);}
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
ds.receive(dp);
String data=new String(dp.getData(),0,dp.getLength());
textarea.append(dp.getAddress()+” “+data+”n");
index++;
ds.close();
}
}
}
} } 第4章 測(cè)試
4.1 測(cè)試環(huán)境與使用方法
測(cè)試環(huán)境:測(cè)試環(huán)境:電腦安裝Java JDK 服務(wù)器端使用方法:打開服務(wù)啟動(dòng),點(diǎn)擊“啟動(dòng)服務(wù)”,提示“啟動(dòng)服務(wù)成功”表示正常啟動(dòng)。否則,先關(guān)閉服務(wù)端,再重新打開,啟動(dòng)服務(wù)。客戶端使用方法:打開客戶端,輸入“服務(wù)器地址”,點(diǎn)擊“連接”,如成功連接系統(tǒng)提示“成功連接”,并收到服務(wù)端返回的“歡迎”信息,否則關(guān)閉并重新啟動(dòng)。
私聊功能使用方法:點(diǎn)擊面板上的“私聊”按鈕,輸入對(duì)方的IP地址,點(diǎn)擊連接,如連接成功系統(tǒng)會(huì)提示“連接成功”。當(dāng)對(duì)方斷開時(shí)會(huì)收到“對(duì)方已下線”提示。如果要同時(shí)跟多人私聊,則要改變本地端口值,并告知對(duì)方。
4.2 功能測(cè)試 4.2.1聊天室窗口
4.2.2 客戶端窗口
4.2.3 內(nèi)嵌“私聊”窗口
參考文獻(xiàn)
用JAVA程序?qū)崿F(xiàn)參考文獻(xiàn)的錄入與生成 劉瑋瑋 2009 《福建電腦》
基于Java移動(dòng)Agent系統(tǒng)的安全參考模型 周屹 2007 《黑龍江工程學(xué)院學(xué)報(bào)》
嵌入式Java虛擬機(jī)的性能優(yōu)化技術(shù) 李允 2004 《計(jì)算機(jī)工程》
第四篇:JAVA課程設(shè)計(jì)報(bào)告_完整版
《JAVA面向?qū)ο蟪绦蛟O(shè)計(jì)》
課 程 設(shè) 計(jì) 報(bào) 告
(2011-2012學(xué)年第2學(xué)期)
系 別: 專業(yè)名稱:
廈門理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系
10級(jí)網(wǎng)絡(luò)工程1班
課程設(shè)計(jì)科目: 《JAVA面向?qū)ο蟪绦蛟O(shè)計(jì)》課程設(shè)計(jì) 學(xué)生姓名: 學(xué) 號(hào): 指導(dǎo)教師: 成 績(jī): 完成時(shí)間:
崔建峰
2012年7月6日
題目JAVA程序課程設(shè)計(jì)
任務(wù)一
手機(jī)號(hào)碼檢測(cè)器
(一)設(shè)計(jì)任務(wù)與目標(biāo)
任務(wù):
手機(jī)號(hào)碼是由11位數(shù)字構(gòu)成,用戶在輸入手機(jī)號(hào)碼時(shí)經(jīng)常混亂輸入若干位數(shù)字或字母,要求你編寫一個(gè)程序檢測(cè)用戶所輸入的手機(jī)號(hào)碼是否符合規(guī)則。要求目標(biāo):
檢測(cè)所輸入的手機(jī)號(hào)碼是否是11位 檢測(cè)每一位是否都為數(shù)字。分析論證:
本題目要求對(duì)用戶輸入的手機(jī)號(hào)碼進(jìn)行檢測(cè),判斷輸入的正確性。曾經(jīng)有做過類似字符比較的題目,可以借鑒。將字符的比較運(yùn)用進(jìn)來,把用戶的輸入字符和正確的進(jìn)行比較。但是必須滿足多次輸入和錯(cuò)誤提醒。同時(shí)還可以添加提示錯(cuò)誤的位置和錯(cuò)誤字符是什么。
程序正確運(yùn)行時(shí)可以滿足以上功能,基本可以達(dá)到題目要求了。
(二)方案設(shè)計(jì)與論證
為了滿足多次輸入的要求,將提示和輸入的操作放在一個(gè)循環(huán)體中,我采用了do_whiele()循環(huán)。每次輸入結(jié)束后提示是否繼續(xù)輸入。
在循環(huán)中逐步對(duì)輸入的號(hào)碼位數(shù)和字符類型進(jìn)行檢測(cè)。位數(shù)可以分超出和不足,并均給出錯(cuò)誤提示。如果位數(shù)滿足要求后對(duì)手機(jī)號(hào)碼類型進(jìn)行檢測(cè)。一般手機(jī)號(hào)在0~9之間,所以不滿足的字符將報(bào)錯(cuò)。通過將輸入的整個(gè)字符串調(diào)用charAt(int i)方法對(duì)字符串逐位比較。
本程序的特點(diǎn)在于可以滿足了多次輸入和錯(cuò)誤字符的顯示(內(nèi)容和位置)。在程序的調(diào)試過程中,有過多次輸入正確的號(hào)碼也會(huì)報(bào)錯(cuò)(還會(huì)報(bào)錯(cuò)0位錯(cuò)誤),這是因?yàn)橛涗涘e(cuò)誤位子的變量放在錯(cuò)誤條件下并且未在循環(huán)體中初始化為0。最終解決了此問題。
(三)程序框圖或流程圖,程序清單與調(diào)用關(guān)系
(四)程序運(yùn)行的測(cè)試與分析
實(shí)現(xiàn)了多次輸入和錯(cuò)誤提示,可以判斷輸入的號(hào)碼的錯(cuò)誤位置及字符,錯(cuò)誤類型,滿足了設(shè)計(jì)構(gòu)思要求。最終結(jié)果如下圖:
實(shí)驗(yàn)結(jié)果截圖:
(五)結(jié)論心得
實(shí)驗(yàn)過程中對(duì)于判斷條件的選擇出現(xiàn)了問題,開始時(shí)覺得要對(duì)輸入的字符一個(gè)一個(gè)的比較,這樣增加了難度也不方便實(shí)現(xiàn)。后面改成了將用戶輸入完成后的全部字符串當(dāng)做整體后再來逐位比較。如果能做成手機(jī)外形的面板并能一個(gè)一個(gè) 3 的判斷,只要輸入錯(cuò)誤字符馬上提示,那功能將更加完善。
任務(wù)二
撲克牌
(一)設(shè)計(jì)任務(wù)與目標(biāo)
任務(wù):
設(shè)計(jì)一個(gè)Card類代表撲克牌,每張牌都有自己的花色和大小。創(chuàng)建一個(gè)DeskOfCards類保存54張撲克牌,設(shè)計(jì)洗牌、發(fā)一張牌、報(bào)告剩余牌數(shù)的方法。創(chuàng)建main方法測(cè)試你的程序。要求目標(biāo):
實(shí)現(xiàn)洗牌和發(fā)牌。
顯示當(dāng)前片面和剩余牌數(shù)。
分析論證:
本題目需要用到數(shù)組來存儲(chǔ)一副紙牌,并需要用到隨機(jī)數(shù)來代替隨機(jī)發(fā)牌,曾經(jīng)做過類似工作。現(xiàn)在需要將產(chǎn)生的隨機(jī)數(shù)和字牌的大小和花色聯(lián)系起來,可以通過數(shù)組來實(shí)現(xiàn)。同時(shí)還要達(dá)到可以循環(huán)發(fā)牌,并有發(fā)牌信息顯示。
(二)方案設(shè)計(jì)與論證
根據(jù)題目要求,我準(zhǔn)備在類Card中用數(shù)組存儲(chǔ)一副牌(52張),考慮到撲克牌有花色和大小并都是固定的,所以用了兩個(gè)字符串?dāng)?shù)組分別初始化花色和大小,再利用下標(biāo)操作把花色和大小組合在一起,存放另在一個(gè)數(shù)組里(最終的紙牌組)。這樣就有了一副完整紙牌了。
再創(chuàng)建另一個(gè)類DeskOfCard創(chuàng)建兩個(gè)Card對(duì)象,通過在循環(huán)里的條件判斷對(duì)對(duì)象進(jìn)行操作:洗牌時(shí)就將紙牌數(shù)組和剩余牌數(shù)重新初始化(利用多余的那個(gè)對(duì)象)。發(fā)牌時(shí)用到隨機(jī)數(shù)產(chǎn)生器,產(chǎn)生從0到51的整數(shù)和數(shù)組小標(biāo)對(duì)應(yīng),每個(gè)元素代表一張牌。
測(cè)試過程中出現(xiàn)了無法顯示牌面的問題,通過對(duì)象引用找不到具體的紙牌,后來在Card類中添加了getCard(int i)方法返回一張牌,實(shí)現(xiàn)了發(fā)牌和剩余牌數(shù),并可以多次發(fā)牌。
(三)程序框圖或流程圖,程序清單與調(diào)用關(guān)系
(四)程序運(yùn)行的測(cè)試與分析
從測(cè)試過程中達(dá)到了分析時(shí)的目的要求,實(shí)現(xiàn)了洗牌和發(fā)牌(顯示牌面和剩余數(shù)量)。最終結(jié)果如下圖:
實(shí)驗(yàn)結(jié)果截圖:
(五)結(jié)論心得
實(shí)驗(yàn)過程中,開始沒有將紙牌的大小和花色分開來定義,導(dǎo)致需要初始化52張牌,后倆采用了循環(huán)體將花色和大小進(jìn)行組合達(dá)到了目的的同時(shí)又簡(jiǎn)化了代碼,提高了可讀性。本來希望最后的結(jié)果可以通過圖片的方式顯示紙牌,但紙牌的原圖片兩太大,實(shí)現(xiàn)過于繁瑣,最終采用了簡(jiǎn)單的文字表示。希望今后有機(jī)會(huì)近一步完善,達(dá)到預(yù)期效果。
任務(wù)三
計(jì)算器
(一)設(shè)計(jì)任務(wù)與目標(biāo)
任務(wù):
參考第六章的實(shí)驗(yàn)題Telephone Keypad界面設(shè)計(jì)一個(gè)計(jì)算器。要求目標(biāo):
實(shí)現(xiàn)輸入數(shù)字和運(yùn)算字符并輸出結(jié)果
結(jié)果由對(duì)應(yīng)的運(yùn)算得出,實(shí)現(xiàn)基本運(yùn)算能力 分析論證:
通過設(shè)計(jì)一個(gè)界面展示一個(gè)計(jì)算器的功能,包括輸入數(shù)字和符號(hào)并進(jìn)行準(zhǔn)確的運(yùn)算得出理想的結(jié)果。在第六章中的Telephone Keypad實(shí)驗(yàn)中做過類似的界面只是實(shí)現(xiàn)的功能不一樣,可在這個(gè)基礎(chǔ)上加入運(yùn)算功能即可實(shí)現(xiàn)要求。
(二)方案設(shè)計(jì)與論證
根據(jù)題目的具體要求,我設(shè)想通過之前的Telephone Keypad實(shí)驗(yàn)進(jìn)行改進(jìn),除了需要加入一些按鈕外,還要對(duì)具體的按鈕功能進(jìn)行設(shè)計(jì)。在Calculator類中進(jìn)行了面板的設(shè)計(jì),之間加入了需要的各個(gè)控件,并且加了ActionListener()類來做事件的觸發(fā)類。
此類中通過event.getSource()方法與相應(yīng)的按鍵進(jìn)行對(duì)應(yīng),以此為判斷條件來決定做什么操作。其中包括了被運(yùn)算數(shù)、運(yùn)算類型、運(yùn)算數(shù)還有等號(hào)的事件。
為了可以輸出信息還要加入JTextField控件來顯示信息,信息通過一個(gè)字 6 符串變量來存取。兩個(gè)JTextField控件分上下,上面顯示最后的運(yùn)算式(包括每次輸入時(shí)均要逐步顯示輸入內(nèi)容),下面顯示最后的結(jié)果并以一定的格式輸出。最后還要滿足多次輸入,因此設(shè)計(jì)了清楚按鍵,每次清楚后可以進(jìn)行下一次的運(yùn)算。
在程序的調(diào)試的過程中出現(xiàn)了,輸出內(nèi)容的錯(cuò)誤。不能逐一的輸出輸入的內(nèi)容,最后也沒有在上面顯示框中顯示完整的運(yùn)算式。通過檢查,發(fā)現(xiàn)是字符串的添加位置和沒有將內(nèi)容在原有基礎(chǔ)上增加,而是每次更新字符串。最終通過修改解決了問題。其間,還出現(xiàn)了按鍵功能的一些的錯(cuò)亂,都是小問題,多次調(diào)試后基本達(dá)到了一個(gè)簡(jiǎn)單運(yùn)算器的功能。
(三)程序框圖或流程圖,程序清單與調(diào)用關(guān)系
(四)程序運(yùn)行的測(cè)試與分析
測(cè)試過程中進(jìn)行了多次的運(yùn)算,包括加、減、乘、除。每次都可以逐一輸出輸入的內(nèi)容并能得出正確的結(jié)果并輸出。清除后可以再次運(yùn)算,基本達(dá)到了預(yù)期要求。最終結(jié)果如下圖: 實(shí)驗(yàn)結(jié)果截圖:
(五)結(jié)論心得
本程序因?yàn)樯婕暗目丶芏啵耘虐婧鸵枚家肿⒁猓蝗蝗菀滓缅e(cuò)誤,導(dǎo)致引用不到你所點(diǎn)擊的那個(gè)按鍵等。還要注意在監(jiān)聽器里的條件判斷時(shí)相應(yīng)的操作要考慮清楚。為了界面美觀和人性化,要將按鍵的順序按一定的順序排列不能隨機(jī)添加。
本程序不足的地方在于運(yùn)算類型只有加減乘除,并且不能再完成一次運(yùn)算后立即進(jìn)行下一次運(yùn)算,必須清楚后重新開始。這些不足還有待改善。相信如果改進(jìn)過后,這個(gè)計(jì)算器會(huì)達(dá)到更加完善的功能和實(shí)用性。
任務(wù)四
憤怒的小鳥
(一)設(shè)計(jì)任務(wù)與目標(biāo)
任務(wù):
憤怒的小鳥是一款“億人迷”的游戲,據(jù)說大家喜歡它的原因在于大家喜歡拋物線勝過直線。例題8.15-8.16是笑臉圖片直線運(yùn)動(dòng)的例子,請(qǐng)修改它在X軸和Y軸的運(yùn)動(dòng)軌跡,將它改成拋物線運(yùn)動(dòng)。
要求目標(biāo):
實(shí)現(xiàn)界面中小鳥打擊目標(biāo)
有準(zhǔn)確的拋物線
可以多次并操作簡(jiǎn)單 分析論證:
在例題笑臉的運(yùn)動(dòng)中實(shí)現(xiàn)了圖片按照一定的像素進(jìn)行平移,到達(dá)一個(gè)目標(biāo)地。所以可以以此為基礎(chǔ)進(jìn)行改進(jìn)。對(duì)運(yùn)動(dòng)中的函數(shù)進(jìn)行改進(jìn),將直線運(yùn)動(dòng)改成拋物線。并有效開始時(shí)出現(xiàn)提示。用戶可以對(duì)圖片的出發(fā)位置進(jìn)行控制。
(二)方案設(shè)計(jì)與論證
為了達(dá)到預(yù)期的目標(biāo),我將創(chuàng)建了一個(gè)BirdPanel類來存放各種組件,主要是存入多張圖片和一個(gè)十分重要的也是這個(gè)程序的核心——定時(shí)器Timer。這個(gè)游戲最終可以看到的效果是圖片的移動(dòng),所以需要通過控制圖片在面板中的位置來實(shí)現(xiàn)移動(dòng)。
所以定時(shí)器就十分重要了,有了定時(shí)器就可以在間隔一段時(shí)間中多次觸發(fā)事件,看到的也就是圖片在不停地移動(dòng),最終到達(dá)目標(biāo)。
在編寫程序過程中,發(fā)現(xiàn)需要實(shí)現(xiàn)客戶對(duì)圖片初始位置的控制比較困難。所以為了節(jié)省時(shí)間就將圖片的觸發(fā)地限制在了固定位置。每次都將從這一位置觸發(fā),并進(jìn)行拋物運(yùn)動(dòng)后,打中目標(biāo)。這雖然使程序簡(jiǎn)單了,可在一定程度上犧牲了部分的功能。今后還有需要改進(jìn)。
(三)程序框圖或流程圖,程序清單與調(diào)用關(guān)系
(四)程序運(yùn)行的測(cè)試與分析
實(shí)驗(yàn)測(cè)試過程完成了游戲開始提示和小鳥圖片的拋物運(yùn)動(dòng),目標(biāo)被打擊后會(huì)場(chǎng)上變化。只是不能多次操作和隨意拖拽小鳥的起始位置,這是一段的局限。最終結(jié)果如下圖:
實(shí)驗(yàn)結(jié)果截圖:
(五)結(jié)論心得
本題目中涉及的核心內(nèi)容是定時(shí)器和圖片坐標(biāo)改變?cè)冢ㄟ\(yùn)動(dòng))的配合使用。通過對(duì)坐標(biāo)的改變,并結(jié)合定時(shí)器功能達(dá)到動(dòng)畫效果。
本程序的不足在于未能達(dá)到預(yù)期的人性化,沒法隨意開始游戲,和市場(chǎng)上的憤怒的小鳥存在巨大差距,這也是這個(gè)程序不成熟的地方,但是總算達(dá)到了能將圖片以拋物線運(yùn)動(dòng)到目的地。基本上完成了目的要求。今后還需繼續(xù)改進(jìn)完善。
任務(wù)五
石頭剪刀布
(一)設(shè)計(jì)任務(wù)與目標(biāo)
任務(wù):
參考第五章的實(shí)驗(yàn)題Rock, Paper, Scissors設(shè)計(jì)并實(shí)現(xiàn)一個(gè)和計(jì)算機(jī)交互的剪刀、石頭、布游戲。人和計(jì)算機(jī)各選擇一項(xiàng),然后決出勝負(fù)。程序必須隨機(jī)選取一項(xiàng)但不表示出來,然后提示用戶選擇。當(dāng)用戶選擇后,程序同時(shí)顯示出計(jì)算機(jī)和用戶的選擇并且輸出游戲結(jié)果。游戲一直進(jìn)行直到用戶退出為止,并且輸出雙方輸贏次數(shù)和總局?jǐn)?shù)。要求目標(biāo):
能夠直觀顯示用戶和電腦的出拳
可以多次進(jìn)行游戲,知道用戶確認(rèn)退出
每次都給出目前勝負(fù)情況
游戲具有隨機(jī)性和準(zhǔn)確性 分析論證:
由于第五章中已經(jīng)編譯過類似的程序,其是通過隨機(jī)數(shù)模擬電腦出拳,在通過用戶輸入模擬自己出拳,最終來比較電腦和用戶的勝負(fù)。只要將原程序改成界面形式并加入具體相應(yīng)的圖片和用戶勝負(fù)情況的提示,其他的游戲比較與原來一致就行。
(二)方案設(shè)計(jì)與論證
根據(jù)題目要求需要建立一個(gè)Panel’類Fight用于存儲(chǔ)圖片和組件。在類 12 中申請(qǐng)了3個(gè)panel,第一個(gè)用于存放圖片,第二個(gè)用于存放按鍵,最后將這兩個(gè)放進(jìn)panel3中。在panel1中的圖片需要根據(jù)panel2中按鍵觸發(fā)的事件進(jìn)行相應(yīng)的改變。電腦和用戶都有石頭、剪刀和布三張圖片進(jìn)行變化。每次在用戶點(diǎn)擊按鍵石頭或剪刀或布后電腦會(huì)根據(jù)隨機(jī)數(shù)產(chǎn)生器發(fā)出的隨機(jī)數(shù)進(jìn)行相應(yīng)的“出拳”,然后和用戶選擇的“出拳”進(jìn)行比較輸贏。當(dāng)用戶選擇后,兩者的出拳圖會(huì)顯示在panel1中,并出現(xiàn)信息說明當(dāng)前游戲總次數(shù)和用戶和電腦各自的勝出次數(shù)。用戶可以再一次游戲介紹后繼續(xù)點(diǎn)擊按鍵進(jìn)行多次游戲,每次重復(fù)上面功能。
因?yàn)楸境绦蚴窃谠谢A(chǔ)上進(jìn)行的改進(jìn),前面又做過小鳥的程序,所以問題不是很大,最不應(yīng)該的是在圖片引用過程中因?yàn)閳D片命名格式的原因耽誤了大量時(shí)間,導(dǎo)致實(shí)驗(yàn)用時(shí)較長。最終完成的游戲還是比較完善的,幾乎達(dá)到了預(yù)期的所有要求。
(三)程序框圖或流程圖,程序清單與調(diào)用關(guān)系
(四)程序運(yùn)行的測(cè)試與分析
本程序運(yùn)行正常,實(shí)現(xiàn)了用戶點(diǎn)擊按鍵嘗試相應(yīng)的圖片,同時(shí)電腦也會(huì)產(chǎn)生相應(yīng)的回應(yīng)發(fā)出它的“猜拳”,每一次都會(huì)給出當(dāng)前的游戲總局?jǐn)?shù)和用戶和電腦各自的勝利局?jǐn)?shù)。并且可以隨意進(jìn)行多次,每次的隨機(jī)性和準(zhǔn)確性良好。界面也較清楚好看。最終結(jié)果如下圖: 實(shí)驗(yàn)結(jié)果截圖:
(五)結(jié)論心得
本題經(jīng)過較長時(shí)間的調(diào)試和完善,達(dá)到了預(yù)期要求和運(yùn)行目標(biāo)。這是本次設(shè)計(jì)用時(shí)最長的題目花了大量時(shí)間,最后總算有所回報(bào),到達(dá)了一個(gè)比較滿意的成果。
任務(wù)六
學(xué)生考勤管理系統(tǒng)
(一)設(shè)計(jì)任務(wù)與目標(biāo)
任務(wù):
考勤信息記錄了學(xué)生的缺課情況,它包括:缺課日期、第幾節(jié)課、課程名稱、學(xué)生姓名、缺課類型(遲到、早退、請(qǐng)假及曠課)。試設(shè)計(jì)考勤管理系統(tǒng),使之能提供以下功能: 要求目標(biāo):
(1)錄入學(xué)生的缺課記錄;
(2)修改某個(gè)學(xué)生的缺課記錄;(3)查詢某個(gè)學(xué)生的缺課情況;
(4)統(tǒng)計(jì)某段時(shí)間內(nèi),曠課學(xué)生姓名及曠課次數(shù);(5)統(tǒng)計(jì)某段時(shí)間內(nèi),有學(xué)生曠課的課程及曠課人次; 分析論證:
本題需要通過用戶界面來直觀的實(shí)現(xiàn)操作,操作盡量簡(jiǎn)單方便,可以實(shí)現(xiàn)上述基本功能。主要以之前的對(duì)話框等GUI組件來實(shí)現(xiàn)用戶的交互。可以輸入和查詢相應(yīng)的信息以及提示信息,并可以實(shí)現(xiàn)簡(jiǎn)單統(tǒng)計(jì)。
(二)方案設(shè)計(jì)與論證
本題我設(shè)計(jì)了一個(gè)主面板來承載多個(gè)
panel;其中最重要的是JTabbedPane組件,它先承載了主要的按鍵及菜單和各個(gè)文本輸入框。其他的面板主要是安放在JTabbedPane上,并且要求面板中的組件按一定規(guī)律排列,用到了布局管理器。
需要實(shí)現(xiàn)的功能主要是錄入、修改、查詢和統(tǒng)計(jì)信息。程序中我分塊編寫了各個(gè)功能的代碼,每個(gè)功能都將用到相應(yīng)監(jiān)聽器,通過按鍵實(shí)現(xiàn)功能。并且在panel類中用到了student類,用于保存基本的學(xué)生信息。
在程序的編譯和調(diào)試過程中出現(xiàn)了許多問題。開始時(shí)面板布局凌亂,輸入信息沒有反應(yīng),并且還會(huì)出現(xiàn)報(bào)錯(cuò)。在布局問題上后來用到了布局管理器,編程時(shí)將各個(gè)功能的版式按照一定的樣式統(tǒng)一設(shè)計(jì),達(dá)到界面簡(jiǎn)潔美觀。輸入信息沒反應(yīng)主要是事件反應(yīng)器的邏輯錯(cuò)誤,經(jīng)過調(diào)整判斷條件等改正了錯(cuò)誤。最后,根據(jù)老師提出的要求最程序提出了完善,可以通過姓名和學(xué)號(hào)查 詢信息,以及不會(huì)重復(fù)輸入同一個(gè)人的信息。基本達(dá)到實(shí)驗(yàn)?zāi)康摹?/p>
(三)程序框圖或流程圖,程序清單與調(diào)用關(guān)系
(四)程序運(yùn)行的測(cè)試與分析
經(jīng)過調(diào)試,程序可以正常運(yùn)行。可以實(shí)現(xiàn)信息的輸入和查詢以及修改和統(tǒng)計(jì)信息數(shù)量。界面布局較合理,實(shí)驗(yàn)截圖如下:
實(shí)驗(yàn)結(jié)果截圖:
(五)結(jié)論心得
本題設(shè)計(jì)時(shí)涉及很多的組件和方法,需要將大量的組件安排到合適的位置,并且要實(shí)現(xiàn)相應(yīng)的功能。工作量較大,在完善過程中問題也很多。不過通過自己的努力和思考,最終成功的完成了實(shí)驗(yàn)。實(shí)驗(yàn)收獲眾多,了解了一個(gè)較復(fù)雜和大段的代碼編寫時(shí)需要耗費(fèi)很大精力。
參考資料
【1】 【美】John lewis,William Loftus 著《Java程序設(shè)計(jì)教程》(第六版)——電子工業(yè)出版社
【2】 【美】Y.Daniel Liang 著《Java語言程序設(shè)計(jì)》(基礎(chǔ)篇)——機(jī)械工業(yè)出版社 【3】 百度知道——http://zhidao.baidu.com/question/33715635.html
【4】 百度文庫——http://wenku.baidu.com/view/c1be6c19c281e53a5802fff1.html
致謝
本次可是設(shè)計(jì)能夠完成的這樣順利需要感謝很多人,這其中就包括軟件班的王浩同學(xué),憤怒的小鳥這個(gè)程序借鑒了他的設(shè)計(jì)。還有就是本班的黃康杰的同學(xué),他在我調(diào)試程序時(shí)給出一些好的建議,幫我解決了問題。特別需要感謝的事我們的崔劍鋒老師,是您一個(gè)學(xué)期以來的嚴(yán)格要求和教導(dǎo),給我傳授知識(shí),今天才能完成這個(gè)課程設(shè)計(jì)。在這里衷心的對(duì)這些給過幫助的人們表示感謝!
附錄:全部源程序清單
源代碼一:手機(jī)號(hào)碼檢測(cè)器 import java.util.Scanner;//手機(jī)號(hào)碼檢測(cè)器 public class Phone { public static void main(String[] args){ 17 String phone,str;char y;int x,m,a;Scanner scan=new Scanner(System.in);do { System.out.println(“請(qǐng)輸入電話號(hào)碼:”);phone=scan.next();x=phone.length();if(x<11)System.out.println(“輸入錯(cuò)誤,位數(shù)不足!”);else if(x>11)System.out.println(“輸入錯(cuò)誤,位數(shù)過多!”);if(x==11){ for(int i=0;i<11;i++){
y=phone.charAt(i);
if(y>='0'&&y<='9')
{ a++;
m=0;a=0;
else
}
else
m=i+1;
}
if(a==11)
System.out.println(“輸入完成!”);else {
System.out.println(“輸入錯(cuò)誤!”);
System.out.println(“第 ”+m+“ 位輸入錯(cuò)誤字符 ”
+phone.charAt(m-1));} }
System.out.print(“繼續(xù)輸入嗎(Y/N): ”);str = scan.next();}while(str.equals(“Y”));System.out.println(“退出輸入!”);} } 源代碼二:撲克牌
//************************************* // Card.java // 主類定義紙牌的花色和大小
//************************************* 19
public class Card {
private String[] card,bao;private int a=0;public Card(){ String[] card1 = { “黑桃”, “紅桃”, “梅花”, “方塊” };//定義兩個(gè)數(shù)組用于組
String[] card2 = { “A”, “2”, “3”, “4”, “5”, “6”, “7”, “8”, “9”, “10”,“J”, “Q”, “K” };
card=new String[52];bao=new String[52];for(int i = 0;i < 4;i++){ for(int j = 0;j < 13;j++){ card[a]=card1[i].concat(card2[j]);bao[a]=card[a];a++;} } } public String getCard(int i){
return card[i];}
}
import java.util.Scanner;public class DeskOfCard { private static int count=52;public static void main(String[] args){
String string,string2;
Card m=new Card();
Card n=new Card();//這里設(shè)定52張牌
Scanner scan =new Scanner(System.in);
do
{
System.out.println(“輸入您要的操作(xipai or fapai):”);
string = scan.next();if(string.equals(“xiapi”)){
m=n;//初始化牌組
count=52;//重新設(shè)定計(jì)數(shù)器
System.out.println(“剩余牌數(shù):”+count);
} else if(string.equals(“fapai”))
{
if(count!=0)//判定牌是否發(fā)完
{
count--;
int r =(int)(Math.random()* 52);// 獲取隨即數(shù)
System.out.println(“抽取的牌為: ”+m.getCard(r)+“,剩余撲克牌數(shù)為: ”+count);// 輸出撲克牌
} // 從ArrayList中去掉已抽到了撲克牌
else
System.out.println(“牌已經(jīng)抽完”);
}
System.out.println(“Want to again(Y/N): ”);
string2=scan.next();}while(string2.equals(“Y”));
}
}
源代碼三:計(jì)算器 import java.awt.*;import java.awt.event.*;import java.text.DecimalFormat;import javax.swing.*;import javax.swing.border.BevelBorder;
//創(chuàng)建Calculator類,繼承自JFrame,實(shí)現(xiàn)接口ActionListener public class Calculator extends JPanel { //聲明相關(guān)變量、對(duì)象,具體作用下面再逐行講解
private DecimalFormat df;private JTextField jieguo,jieguo2;private JButton[] button;private JPanel panel1,panel2,panel3;private double result,num1,num2;private int yunsuan,kong1 = 0;private String s = “", s1 = ”“,s2= ”“;public Calculator()//構(gòu)造方法
{
df = new DecimalFormat(”0.0000“);//設(shè)置結(jié)果小數(shù)點(diǎn)位數(shù)
jieguo = new JTextField(20);
jieguo.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
jieguo.setBackground(new Color(240,245,254));
jieguo.setEditable(false);22
jieguo2 = new JTextField(20);
jieguo2.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
jieguo2.setBackground(new Color(240,245,254));
jieguo2.setEditable(false);
panel1 = new JPanel();
panel1.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
panel1.setLayout(new BoxLayout(panel1,BoxLayout.Y_AXIS));
panel1.setBackground(new Color(240,245,254));
panel1.add(jieguo);
panel1.add(jieguo2);
panel2 = new JPanel();
panel2.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
panel2.setBackground(new Color(229,238,250));
panel2.setLayout(new GridLayout(5,4,4,4));
//各個(gè)按鈕的名字
String name[] ={”1“,”2“,”3“,”+“,”4“,”5“,”6“,”-“,”7“,”8“,”9“,”*“,”0“,”.“,”=“,”/“,”C“};
button = new JButton[name.length];
for(int i = 0;i < name.length;i++)//實(shí)例化各個(gè)按鈕
{
button[i] = new JButton(name[i]);
button[i].setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
button[i].setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
button[i].setPreferredSize(new Dimension(5,35));
button[i].addActionListener(new ButtonListener());
panel2.add(button[i]);
}
panel3 = new JPanel();
panel3.setBackground(new Color(229,238,250));//設(shè)置布局管理
panel3.setLayout(new BoxLayout(panel3,BoxLayout.Y_AXIS));
panel3.add(panel1);
panel3.add(Box.createRigidArea(new Dimension(0,30)));
panel3.add(panel2);
add(panel3);
} private class ButtonListener implements ActionListener 23 { public void actionPerformed(ActionEvent event){
//沒有輸入加減乘除時(shí)空=0,記錄被運(yùn)算數(shù)
if(kong1 == 0)
{
if(event.getSource()== button[0])
s1 += 1;
if(event.getSource()== button[1])
s1 += 2;
if(event.getSource()== button[2])
s1 += 3;
if(event.getSource()== button[4])
s1 += 4;
if(event.getSource()== button[5])
s1 += 5;
if(event.getSource()== button[6])
s1 += 6;
if(event.getSource()== button[8])
s1 += 7;
if(event.getSource()== button[9])
s1 += 8;
if(event.getSource()== button[10])
s1 += 9;
if(event.getSource()== button[12])
s1 += 0;
if(event.getSource()== button[13])
s1 += ”.“;
//當(dāng)鍵入加減乘除后,設(shè)置kong=1
if(event.getSource()== button[7] || event.getSource()== button[3] ||event.getSource()== button[15] || event.getSource()== button[11])
{
num1 = Double.parseDouble(jieguo.getText());
//記錄運(yùn)算類型
if(event.getSource()== button[3])
{
yunsuan = 1;
s1 += ”+“;
} 24
if(event.getSource()== button[7])
{
yunsuan = 2;
s1 += ”-“;
}
if(event.getSource()== button[11])
{
yunsuan = 3;
s1 += ”*“;
}
if(event.getSource()== button[15])
{
yunsuan = 4;
s1 += ”/“;
}
kong1 = 1;}
s = s1;jieguo.setText(s);} //此時(shí)記錄運(yùn)算數(shù) if(kong1 ==1){ if(event.getSource()== button[0])
s2 += 1;if(event.getSource()== button[1])
s2 += 2;if(event.getSource()== button[2])
s2 += 3;if(event.getSource()== button[4])
s2 += 4;if(event.getSource()== button[5])
s2 += 5;if(event.getSource()== button[6])
s2 += 6;if(event.getSource()== button[8])
s2 += 7;if(event.getSource()== button[9])
s2 += 8;if(event.getSource()== button[10])
s2 += 9;if(event.getSource()== button[12])
s2 += 0;
誤
if(event.getSource()== button[13])
s2 += ”.“;s =s1+ s2;jieguo.setText(s);//重復(fù)出現(xiàn)運(yùn)算數(shù)???? } if(event.getSource()== button[14])//當(dāng)按下等號(hào)時(shí),設(shè)置結(jié)果label的內(nèi)容 { s += ”=“;jieguo.setText(s);num2 = Double.parseDouble(s2);switch(yunsuan){ case 1:
result = num1 + num2;
break;
case 2:
result = num1-num2;
break;
case 3:
result = num1 * num2;
break;
case 4:
if(s2.length()==1 && s2.charAt(0)=='0')//當(dāng)初數(shù)為零時(shí)提示錯(cuò)
jieguo2.setText(”0不能做除數(shù)“);
else
result = num1/num2;
break;}
jieguo.setText(s);//輸出算式
jieguo2.setText(df.format(result));//格式化輸出結(jié)果 }
if(event.getSource()== button[16])//將當(dāng)前文本框內(nèi)數(shù)據(jù)清除 { jieguo.setText(”“);jieguo2.setText(”“);s = ”“;s1 = ”“;s2 = ”“;yunsuan = 0;kong1 = 0;26
}
} } } import javax.swing.JFrame;public class TestCal { public static void main(String[] args){
Calculator calculator = new Calculator();
JFrame frame =new JFrame(”Calculator“);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.getContentPane().add(calculator);frame.pack();frame.setVisible(true);
} } 源代碼四: 憤怒的小鳥 import java.awt.*;import java.awt.event.*;import javax.swing.*;
public class BirdPanel extends JPanel { private final int WIDTH = 1020, HEIGHT = 620;private final int DELAY = 90, IMAGE_SIZE = 40;private ImageIcon image,image2,image3;private Timer timer;private int x, y, moveX, moveY;//---// 設(shè)置面板,包括為了動(dòng)畫引用計(jì)時(shí)器
//---public BirdPanel(){ timer = new Timer(DELAY, new AListener());
image = new ImageIcon(”鳥.png“);image2 = new ImageIcon(”目標(biāo).gif“);image3 = new ImageIcon(”birds1.jpg“);x = 0;y = 500;moveX = 30;27 moveY =-30;//豎直方向向上,做拋物線需要
setPreferredSize(new Dimension(WIDTH, HEIGHT));setBackground(Color.WHITE);
timer.start();} //---// 面板中顯示該有的圖片
//---public void paintComponent(Graphics page){ super.paintComponent(page);image3.paintIcon(this, page, 330, 0);image.paintIcon(this, page, x, y);image2.paintIcon(this, page, 900, 550);} //***************************************************************** // 定時(shí)器的操作監(jiān)聽程序
//***************************************************************** private class AListener implements ActionListener { // // 更新圖像的位置和可能的運(yùn)動(dòng)方向每當(dāng)計(jì)時(shí)器觸發(fā)操作事件 // // public void actionPerformed(ActionEvent event){ moveY +=2;//為了做拋物線每次少提高2個(gè)像素,最終才會(huì)下落 x += moveX;//以設(shè)定好的像素移動(dòng) y += moveY;
//判斷達(dá)到目標(biāo)后停止,并產(chǎn)生相應(yīng)的變化效果 if(x >= WIDTH-IMAGE_SIZE){ x = WIDTH-IMAGE_SIZE;} if(y >= HEIGHT-IMAGE_SIZE){ y= HEIGHT-IMAGE_SIZE;image2 = new ImageIcon(”變身.jpg“);image = new ImageIcon(”...“);//小鳥消失 } repaint();28 } } } //************************************************************* // Bird.java // // Angry birds!//************************************************************* import java.awt.*;import java.awt.event.*;import javax.swing.*;
public class Bird { public static void main(String[] args){ String x;x = ”開始 憤怒的小鳥游戲?“;JOptionPane.showMessageDialog(null,x);
JFrame frame = new JFrame(”Angry birds“);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.getContentPane().add(new BirdPanel());frame.pack();frame.setVisible(true);} } 源代碼五: 剪刀石頭布 import java.awt.*;import java.awt.event.*;import java.util.Random;import javax.swing.*;import javax.swing.border.BevelBorder;
public class Fight extends JPanel { private JPanel panel1,panel2,panel3;private JLabel computer,bi,person;private ImageIcon ShiTouP,JianZiP,BuP,kong;private JButton shitouB,jianziB,buB;private Random generator;private int total = 0,c=0,p=0;public Fight(){
generator = new Random();//定義圖片
ShiTouP = new ImageIcon(”石頭.jpg“);JianZiP = new ImageIcon(”剪刀.jpg“);BuP = new ImageIcon(”布.jpg“);kong = new ImageIcon(”VS.jpg“);
//引用圖片給電腦和用戶
person = new JLabel(new ImageIcon(”客戶.gif“));bi = new JLabel(kong);computer =new JLabel(new ImageIcon(”電腦.jpg“));
panel1 = new JPanel();panel1.setBackground(Color.BLUE);panel1.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));panel1.setLayout(new BoxLayout(panel1,BoxLayout.X_AXIS));panel1.add(person);panel1.add(bi);panel1.add(computer);panel1.setPreferredSize(new Dimension(450,180));shitouB = new JButton(”石頭“);shitouB.addActionListener(new Mouse());jianziB = new JButton(”剪刀“);jianziB.addActionListener(new Mouse());
buB = new JButton(”布“);buB.addActionListener(new Mouse());panel2 = new JPanel();panel2.setLayout(new BoxLayout(panel2,BoxLayout.X_AXIS));panel2.add(jianziB);panel2.add(shitouB);panel2.add(buB);panel2.setPreferredSize(new Dimension(450,50));panel2.setBackground(new Color(200,218,235));
panel3 = new JPanel();panel3.setBackground(new Color(200,218,235));panel3.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));30 panel3.setLayout(new BoxLayout(panel3,BoxLayout.Y_AXIS));panel3.add(panel1);panel3.add(Box.createRigidArea(new Dimension(0,50)));panel3.add(panel2);
add(panel3);panel3.setPreferredSize(new Dimension(500,350));}
{ {
int ran = generator.nextInt(3);if(event.getSource()== jianziB){
person.setIcon(JianZiP);//當(dāng)產(chǎn)生比較后根據(jù)結(jié)果變換圖片
if(ran == 0)
{
total += 1;
bi.setIcon(kong);
computer.setIcon(JianZiP);
}
if(ran == 1)
{
total += 1;
c += 1;
bi.setIcon(kong);
computer.setIcon(ShiTouP);
}
if(ran == 2)
{
total += 1;
p += 1;
bi.setIcon(kong);
computer.setIcon(BuP);
} } if(event.getSource()== shitouB){
person.setIcon(ShiTouP);
if(ran == 0)
{
private class Mouse implements ActionListener public void actionPerformed(ActionEvent event)
total += 1;
bi.setIcon(kong);
p += 1;
computer.setIcon(JianZiP);} if(ran == 1){
total += 1;
bi.setIcon(kong);
computer.setIcon(ShiTouP);} if(ran == 2){
total += 1;
c += 1;
bi.setIcon(kong);
computer.setIcon(BuP);} }
if(event.getSource()== buB){ person.setIcon(BuP);if(ran == 0){
total += 1;
bi.setIcon(kong);
c += 1;
computer.setIcon(JianZiP);} if(ran == 1){
total += 1;
bi.setIcon(kong);
p += 1;
computer.setIcon(ShiTouP);} if(ran == 2){
total += 1;
bi.setIcon(kong);
computer.setIcon(BuP);
}
}
if(event.getSource()== jianziB || event.getSource()== shitouB
|| event.getSource()== buB)
{
int again = JOptionPane.showConfirmDialog(panel2,”比賽進(jìn)行了:“
+total+”次--您贏了“+p+”次--電腦贏了:“+c+”次 還要繼續(xù)玩嗎?“
,”提示“,JOptionPane.YES_NO_OPTION);
if(again==JOptionPane.NO_OPTION)
System.exit(0);
} }
}
} //********************************** // TestFight.java // //********************************** import javax.swing.JFrame;public class TestFight {
public static void main(String[] args){
Fight fight = new Fight();
JFrame frame =new JFrame(”石頭剪刀布“);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.getContentPane().add(fight);frame.pack();frame.setVisible(true);} }
源代碼六:
//******************************************** // Student.java // 學(xué)生類,包括了各種屬性的設(shè)置和取值方法
//********************************************** public class Student 33 { int xuehao,keshi;String xingming,kemu,leixing,riqi;public Student(String xingming,int xuehao,String riqi,int keshi,String kemu,String leixing){ //構(gòu)造函數(shù)
this.xingming=xingming;
this.xuehao=xuehao;
this.riqi=riqi;
this.kemu=kemu;
this.keshi=keshi;
this.leixing=leixing;} //各個(gè)屬性的get和set方法
public String getXingMing(){ return xingming;} public void setXingMing(String xingming){
this.xingming=xingming;} public int getXueHao(){ return xuehao;} public void setXueHao(int xuehao){
this.xuehao=xuehao;} public String getRiQi(){ return riqi;} public void setRiQi(String riqi){
this.riqi=riqi;} public int getKeShi(){
return keshi;} public void setKeShi(int keshi){ 34
this.keshi=keshi;} public String getKeMu(){ return kemu;} public void setKeMu(String kemu){
this.kemu=kemu;} public String getLeiXing(){ return leixing;} public void setLeiXing(String leixing){
this.leixing=leixing;} }
//************************************ // 運(yùn)行類
//************************************
import java.awt.Dimension;import javax.swing.JFrame;
public class TestKaoQing { public static void main(String[] args){
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new kaoqin());
frame.pack();
frame.setVisible(true);
} }
//****************************************** // kaoqin.java // 考勤類,定義了主要的面板和功能實(shí)現(xiàn)
//******************************************* import java.awt.*;import java.awt.event.*;import javax.swing.*;
import java.util.ArrayList;import javax.swing.border.BevelBorder;
public class kaoqin extends JPanel { JLabel jieguo;//統(tǒng)計(jì)功能的組件定義
JButton xAt,kAr;JTextArea JieGuo;JPanel jieguoP,panelB,account;
JLabel background1,background2,background3,background4;ArrayList
JTextField xingming11,xuehao11,riqi11,keshi11,kemu11,leixing11;String xingming111,xuehao111,riqi111,keshi111,kemu111,leixing111;JPanel Input,panel11,panel12,panel13,panel14,panel15,panel16;
JLabel xingming2,xuehao2,riqi2,keshi2,kemu2,leixing2;//修改功能組件的定義
JTextField xingming22,xuehao22,riqi22,keshi22,kemu22,leixing22;String xingming222,xuehao222,riqi222,keshi222,kemu222,leixing222;JPanel Modify,panel21,panel22,panel23,panel24,panel25,panel26,panel27;
JLabel xingming3,xuehao3,riqi3,keshi3,kemu3,leixing3;//查找功能組件的定義
JTextField xingming33,xuehao33,riqi33,keshi33,kemu33,leixing33;String xingming333,xuehao333,riqi333,keshi333,kemu333,leixing333;JPanel Find,panel31,panel32,panel33,panel34,panel35,panel36;
JButton tijiao1,xiugai2,chaxun2,chaxun3;//各個(gè)按鈕的定義
JTabbedPane tb;Integer cha1 = null,cha2 = null;public kaoqin(){
background1 = new JLabel(”請(qǐng)錄入學(xué)生信息!“);//提示信息的初始化
background2 = new JLabel(”請(qǐng)使用學(xué)號(hào)和姓名查詢!“);background3 = new JLabel(”請(qǐng)使用學(xué)號(hào)和姓名查詢!“);
student = new ArrayList
xingming1=new JLabel(”學(xué)生姓名:“);//錄入界面各個(gè)組件的安排
xuehao1=new JLabel(”學(xué)生學(xué)號(hào):“);riqi1=new JLabel(”缺勤日期:“);keshi1=new JLabel(”缺勤課時(shí):“);kemu1=new JLabel(”缺勤科目:“);leixing1=new JLabel(”缺勤類型:“);
xingming11=new JTextField(8);
xingming11.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
xuehao11=new JTextField(8);
xuehao11.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
riqi11=new JTextField(8);riqi11.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
keshi11=new JTextField(8);
keshi11.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
kemu11=new JTextField(8);kemu11.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
leixing11=new JTextField(8);
leixing11.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
panel11 = new JPanel();panel11.setBackground(new Color(230,239,255));panel11.setLayout(new BoxLayout(panel11,BoxLayout.X_AXIS));panel11.add(Box.createRigidArea(new Dimension(30,15)));panel11.add(xingming1);panel11.add(xingming11);
panel12 = new JPanel();panel12.setBackground(new Color(230,239,255));panel12.setLayout(new BoxLayout(panel12,BoxLayout.X_AXIS));panel12.add(Box.createRigidArea(new Dimension(30,0)));panel12.add(xuehao1);panel12.add(xuehao11);
panel13 = new JPanel();panel13.setBackground(new Color(230,239,255));panel13.setLayout(new BoxLayout(panel13,BoxLayout.X_AXIS));panel13.add(Box.createRigidArea(new Dimension(30,0)));panel13.add(riqi1);panel13.add(riqi11);
panel14 = new JPanel();panel14.setBackground(new Color(230,239,255));panel14.setLayout(new BoxLayout(panel14,BoxLayout.X_AXIS));panel14.add(Box.createRigidArea(new Dimension(30,0)));panel14.add(keshi1);panel14.add(keshi11);
panel15 = new JPanel();panel15.setBackground(new Color(230,239,255));panel15.setLayout(new BoxLayout(panel15,BoxLayout.X_AXIS));panel15.add(Box.createRigidArea(new Dimension(30,0)));panel15.add(kemu1);panel15.add(kemu11);
panel16 = new JPanel();panel16.setBackground(new Color(230,239,255));panel16.setLayout(new BoxLayout(panel16,BoxLayout.X_AXIS));panel16.add(Box.createRigidArea(new Dimension(30,0)));panel16.add(leixing1);panel16.add(leixing11);
tijiao1 = new JButton(”提交“);tijiao1.setFont(new Font(”幼圓“, Font.BOLD, 18));tijiao1.setPreferredSize(new Dimension(50,20));tijiao1.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));tijiao1.addActionListener(new ButtonListener());
Input=new JPanel();Input.setBackground(new Color(230,239,255));Input.setLayout(new BoxLayout(Input,BoxLayout.Y_AXIS));Input.add(Box.createRigidArea(new Dimension(30,0)));Input.add(background1);Input.add(Box.createRigidArea(new Dimension(0,10)));Input.add(panel11);//將各個(gè)panel添加到Input中
Input.add(panel12);Input.add(panel13);Input.add(panel14);Input.add(panel15);Input.add(panel16);Input.add(Box.createRigidArea(new Dimension(0,10)));Input.add(tijiao1);// 按鍵的添加
xingming2=new JLabel(”學(xué)生姓名:“);//修改界面各個(gè)組件的安排
xuehao2=new JLabel(”學(xué)生學(xué)號(hào):“);riqi2=new JLabel(”缺勤日期:“);keshi2=new JLabel(”缺勤課時(shí):“);kemu2=new JLabel(”缺勤科目:“);leixing2=new JLabel(”缺勤類型:“);xingming22=new JTextField(8);
xingming22.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
xuehao22=new JTextField(8);
xuehao22.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
riqi22=new JTextField(8);riqi22.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
keshi22=new JTextField(8);
keshi22.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
kemu22=new JTextField(8);kemu22.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
leixing22=new JTextField(8);
leixing22.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
panel21 = new JPanel();panel21.setBackground(new Color(230,239,255));panel21.setLayout(new BoxLayout(panel21,BoxLayout.X_AXIS));panel21.add(Box.createRigidArea(new Dimension(30,15)));panel21.add(xingming2);panel21.add(xingming22);
panel22 = new JPanel();panel22.setBackground(new Color(230,239,255));panel22.setLayout(new BoxLayout(panel22,BoxLayout.X_AXIS));panel22.add(Box.createRigidArea(new Dimension(30,0)));panel22.add(xuehao2);panel22.add(xuehao22);
panel23 = new JPanel();panel23.setBackground(new Color(230,239,255));panel23.setLayout(new BoxLayout(panel23,BoxLayout.X_AXIS));panel23.add(Box.createRigidArea(new Dimension(30,0)));panel23.add(riqi2);panel23.add(riqi22);
panel24 = new JPanel();panel24.setBackground(new Color(230,239,255));panel24.setLayout(new BoxLayout(panel24,BoxLayout.X_AXIS));panel24.add(Box.createRigidArea(new Dimension(30,0)));panel24.add(keshi2);panel24.add(keshi22);
panel25 = new JPanel();panel25.setBackground(new Color(230,239,255));panel25.setLayout(new BoxLayout(panel25,BoxLayout.X_AXIS));panel25.add(Box.createRigidArea(new Dimension(30,0)));panel25.add(kemu2);panel25.add(kemu22);
panel26 = new JPanel();panel26.setBackground(new Color(230,239,255));panel26.setLayout(new BoxLayout(panel26,BoxLayout.X_AXIS));panel26.add(Box.createRigidArea(new Dimension(30,0)));panel26.add(leixing2);panel26.add(leixing22);
xiugai2 = new JButton(”修改“);xiugai2.setFont(new Font(”幼圓“, Font.BOLD, 18));xiugai2.setPreferredSize(new Dimension(50,20));xiugai2.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));xiugai2.addActionListener(new ButtonListener());
chaxun2 = new JButton(”查詢“);chaxun2.setPreferredSize(new Dimension(50,20));chaxun2.setFont(new Font(”幼圓“, Font.BOLD, 18));chaxun2.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));chaxun2.addActionListener(new ButtonListener());
panel27 = new JPanel();panel27.setLayout(new BoxLayout(panel27,BoxLayout.X_AXIS));panel27.add(xiugai2);panel27.add(chaxun2);
Modify = new JPanel();Modify.setBackground(new Color(230,239,255));Modify.setLayout(new BoxLayout(Modify,BoxLayout.Y_AXIS));Modify.add(Box.createRigidArea(new Dimension(30,0)));Modify.add(background2);Modify.add(Box.createRigidArea(new Dimension(0,10)));Modify.add(panel21);Modify.add(panel22);Modify.add(panel23);Modify.add(panel24);Modify.add(panel25);Modify.add(panel26);Modify.add(Box.createRigidArea(new Dimension(0,10)));Modify.add(panel27);
xingming3=new JLabel(”學(xué)生姓名:“);//查找界面各個(gè)組件的安排
xuehao3=new JLabel(”學(xué)生學(xué)號(hào):“);riqi3=new JLabel(”缺勤日期:“);keshi3=new JLabel(”缺勤課時(shí):“);kemu3=new JLabel(”缺勤科目:“);leixing3=new JLabel(”缺勤類型:“);
xingming33=new JTextField(8);
xingming33.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
xuehao33=new JTextField(8);
xuehao33.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
riqi33=new JTextField(8);riqi33.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
keshi33=new JTextField(8);
keshi33.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
kemu33=new JTextField(8);kemu33.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
leixing33=new JTextField(8);
leixing33.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
panel31 = new JPanel();panel31.setBackground(new Color(230,239,255));panel31.setLayout(new BoxLayout(panel31,BoxLayout.X_AXIS));panel31.add(Box.createRigidArea(new Dimension(30,10)));panel31.add(xingming3);panel31.add(xingming33);
panel32 = new JPanel();panel32.setBackground(new Color(230,239,255));panel32.setLayout(new BoxLayout(panel32,BoxLayout.X_AXIS));panel32.add(Box.createRigidArea(new Dimension(30,0)));panel32.add(xuehao3);panel32.add(xuehao33);
panel33 = new JPanel();panel33.setBackground(new Color(230,239,255));panel33.setLayout(new BoxLayout(panel33,BoxLayout.X_AXIS));panel33.add(Box.createRigidArea(new Dimension(30,0)));panel33.add(riqi3);42
panel33.add(riqi33);
panel34 = new JPanel();panel34.setBackground(new Color(230,239,255));panel34.setLayout(new BoxLayout(panel34,BoxLayout.X_AXIS));panel34.add(Box.createRigidArea(new Dimension(30,0)));panel34.add(keshi3);panel34.add(keshi33);
panel35 = new JPanel();panel35.setBackground(new Color(230,239,255));panel35.setLayout(new BoxLayout(panel35,BoxLayout.X_AXIS));panel35.add(Box.createRigidArea(new Dimension(30,0)));panel35.add(kemu3);panel35.add(kemu33);
panel36 = new JPanel();panel36.setBackground(new Color(230,239,255));panel36.setLayout(new BoxLayout(panel36,BoxLayout.X_AXIS));panel36.add(Box.createRigidArea(new Dimension(30,0)));panel36.add(leixing3);panel36.add(leixing33);
chaxun3=new JButton(”查詢“);chaxun3.setPreferredSize(new Dimension(50,20));chaxun3.setFont(new Font(”幼圓“, Font.BOLD, 18));chaxun3.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));chaxun3.addActionListener(new ButtonListener());
Find = new JPanel();Find.setBackground(new Color(230,239,255));Find.setLayout(new BoxLayout(Find,BoxLayout.Y_AXIS));Find.add(Box.createRigidArea(new Dimension(30,5)));Find.add(background3);Find.add(Box.createRigidArea(new Dimension(0,10)));Find.add(panel31);Find.add(panel32);Find.add(panel33);Find.add(panel34);Find.add(panel35);43
Find.add(panel36);Find.add(Box.createRigidArea(new Dimension(0,10)));Find.add(chaxun3);
jieguo = new JLabel(”統(tǒng)計(jì)結(jié)果:“);//統(tǒng)計(jì)功能各個(gè)組件的安排 background4 = new JLabel(”統(tǒng)計(jì)“);xAt= new JButton(”學(xué)生和次數(shù)“);xAt.setPreferredSize(new Dimension(50,20));xAt.setFont(new Font(”幼圓“, Font.BOLD, 10));xAt.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));xAt.addActionListener(new ButtonListener());
kAr= new JButton(”課程和人數(shù)“);kAr.setPreferredSize(new Dimension(50,20));kAr.setFont(new Font(”幼圓“, Font.BOLD, 10));kAr.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));kAr.addActionListener(new ButtonListener());
JieGuo=new JTextArea();JieGuo.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
jieguoP = new JPanel();jieguoP.setBackground(new Color(230,239,255));jieguoP.setLayout(new BoxLayout(jieguoP,BoxLayout.X_AXIS));jieguoP.add(Box.createRigidArea(new Dimension(10,0)));jieguoP.setPreferredSize(new Dimension(40,20));jieguoP.add(jieguo);jieguoP.add(JieGuo);panelB= new JPanel();panelB.setBackground(new Color(230,239,255));panelB.setLayout(new BoxLayout(panelB,BoxLayout.X_AXIS));panelB.add(Box.createRigidArea(new Dimension(30,0)));panelB.add(xAt);panelB.add(kAr);44
account=new JPanel();
account.setBackground(new Color(230,239,255));
account.setLayout(new BoxLayout(account,BoxLayout.Y_AXIS));
account.add(Box.createRigidArea(new Dimension(30,5)));
account.add(background4);
account.add(Box.createRigidArea(new Dimension(0,10)));
account.add(jieguoP);
account.add(Box.createRigidArea(new Dimension(0,10)));
account.add(panelB);
tb = new JTabbedPane();tb.setBackground(new Color(230,239,255));tb.setBounds(0,0,400,400);
tb.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
tb.addTab(”錄入“,Input);//將各個(gè)功能模塊加到tb中
tb.addTab(”修改“,Modify);tb.addTab(”查詢“,Find);tb.addTab(”統(tǒng)計(jì)“,account);setLayout(new BorderLayout());add(tb,BorderLayout.CENTER);
setSize(new Dimension(400,400));
}
private class ButtonListener implements ActionListener //監(jiān)聽器類
{ public void actionPerformed(ActionEvent event){
xingming111=xingming11.getText();//錄入功能監(jiān)聽
xuehao111=xuehao11.getText();
riqi111=riqi11.getText();
keshi111=keshi11.getText();
kemu111=kemu11.getText();
leixing111=leixing11.getText();if(event.getSource()== tijiao1)//判斷是否已經(jīng)存在輸入的學(xué)生信息
{
for(int j = 0;j { 45 if(Integer.toString(student.get(j).getXueHao()).equals(xuehao111) || student.get(j).getXingMing().equals(xingming111)) { cha1=j; } } if(cha1 == null)//無此學(xué)生信息則錄入信息 { student.add(new Student(xingming111,Integer.parseInt(xuehao111),riqi111,Integer.parseInt(keshi111),kemu111,leixing111)); background1.setText(”錄入信息成功!“); xingming11.setText(null); xuehao11.setText(null); riqi11.setText(null); keshi11.setText(null); kemu11.setText(null); leixing11.setText(null); } else { background1.setText(”學(xué)生已有信息存在,有需要請(qǐng)修改!“); xingming11.setText(null); xuehao11.setText(null); riqi11.setText(null); keshi11.setText(null); kemu11.setText(null); leixing11.setText(null); } } if(event.getSource()==chaxun2)//修改功能監(jiān)聽 { if(student.size()== 0) background2.setText(”暫無任何學(xué)生信息,請(qǐng)先錄入!“); else { for(int j = 0;j { xuehao222=xuehao22.getText(); xingming222=xingming22.getText(); if(Integer.toString(student.get(j).getXueHao()).equals(xuehao222) ||student.get(j).getXingMing().equals(xingming222)) { cha1 = j; } } if(cha1==null) { background2.setText(”無該學(xué)生信息,請(qǐng)重新查詢!“); xingming22.setText(”“); xuehao22.setText(”“); riqi22.setText(”“); keshi22.setText(”“); kemu22.setText(”“); leixing22.setText(”“); } } xingming22.setText(student.get(cha1).getXingMing());xuehao22.setText(Integer.toString(student.get(cha1).getXueHao()));riqi22.setText(student.get(cha1).getRiQi());keshi22.setText(Integer.toString(student.get(cha1).getKeShi()));kemu22.setText(student.get(cha1).getKeMu());leixing22.setText(student.get(cha1).getLeiXing());} if(event.getSource()== xiugai2)//當(dāng)查到信息后開始修改 { student.remove(cha1); student.get(cha1).setKeMu(kemu22.getText()); student.get(cha1).setKeShi(Integer.parseInt(keshi22.getText())); student.get(cha1).setLeiXing(leixing22.getText()); student.get(cha1).setRiQi(riqi22.getText()); student.get(cha1).setXingMing(xingming22.getText()); student.get(cha1).setXueHao(Integer.parseInt(xuehao22.getText())); cha1 = null; xingming22.setText(null);//改后將文本框信息置空 xuehao22.setText(null); riqi22.setText(null); keshi22.setText(null); kemu22.setText(null); leixing22.setText(null); background2.setText(”修改成功!“); } if(event.getSource()== chaxun3)//查詢功能監(jiān)聽 { if(student.size()== 0) background3.setText(”暫無任何學(xué)生信息,請(qǐng)先錄入!“); else { for(int j = 0;j { xuehao333=xuehao33.getText(); xingming333=xingming33.getText();// 通過比較輸入的學(xué)號(hào)或是姓名進(jìn)行查詢 if(Integer.toString(student.get(j).getXueHao()).equals(xuehao333) || student.get(j).getXingMing().equals(xingming333)) { cha2 = j; } } if(cha2==null) { background3.setText(”無該學(xué)生信息,請(qǐng)重新查詢!“); xingming33.setText(”“); xuehao33.setText(”“); riqi33.setText(”“); keshi33.setText(”“); kemu33.setText(”“); leixing33.setText(”“); } } xingming33.setText(student.get(cha2).getXingMing());48 xuehao33.setText(Integer.toString(student.get(cha2).getXueHao())); riqi33.setText(student.get(cha2).getRiQi()); keshi33.setText(Integer.toString(student.get(cha2).getKeShi())); kemu33.setText(student.get(cha2).getKeMu()); leixing33.setText(student.get(cha2).getLeiXing()); background3.setText(”查詢成功!“); cha2 = null;} if(event.getSource()== xAt)//統(tǒng)計(jì)功能的監(jiān)聽,按學(xué)生名和課時(shí)統(tǒng)計(jì) { int sum=0; String str=”“; if(student.size()==0) background4.setText(”無任何學(xué)生信息!“); else for(int i=0;i { if(student.get(i).getKeShi()!=0) { sum += student.get(i).getKeShi();//統(tǒng)計(jì)學(xué)生缺勤總課時(shí) str += student.get(i).xingming+”>“;//統(tǒng)計(jì)學(xué)生的名字 } JieGuo.setText(” 缺勤人:n“+str +”n總共缺勤 “+ sum+”次!“); // 輸出統(tǒng)計(jì)結(jié)果 } } if(event.getSource()== kAr)//按課程名和缺勤人數(shù)統(tǒng)計(jì) { int sum2=0; String str2=”“; if(student.size()==0) background4.setText(”無任何學(xué)生信息!“); else for(int j=0;j { 49 if(student.get(j).getKeShi()!=0){ sum2 ++;str2 +=student.get(j).getKeMu()+”>“; } JieGuo.setText(” 有學(xué)生缺勤科目:n“+str2+”n缺勤人數(shù)為: "+sum2); } } } } } 1--計(jì)算器 Java實(shí)習(xí)報(bào)告 目錄 一、課程設(shè)計(jì)目的.................................................................................................................2 二、課程設(shè)計(jì)任務(wù)..................................................................................................................2 2.1、設(shè)計(jì)任務(wù)................................................................................................................2 2.2、課程設(shè)計(jì)要求:....................................................................................................2 2.3、需求分析................................................................................................................2 三、開發(fā)工具與平臺(tái).............................................................................................................3 3.1、開發(fā)工具................................................................................................................3 3.2、開發(fā)平臺(tái)................................................................................................................3 四、設(shè)計(jì)思路..........................................................................................................................4 4.1、界面設(shè)計(jì).................................................................................................................4 4.2.1、邏輯設(shè)計(jì).............................................................................................................4 4.2.2、程序流程圖...........................................................................................................5 4.2.3、主要代碼展示及說明............................................................................................5 4.3、程序測(cè)試............................................................................................................10 五、實(shí)驗(yàn)小結(jié)........................................................................................................................11 六、附錄(程序代碼)..........................................................................................................12 頁 第 1--計(jì)算器 Java實(shí)習(xí)報(bào)告 一、課程設(shè)計(jì)目的 1、熟練掌握java面向?qū)ο缶幊獭?/p> 2、選擇合適的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)需求。 3、熟練使用各種控制結(jié)構(gòu)。 4、GUI組件、事件處理技術(shù)。 二、課程設(shè)計(jì)任務(wù) 2.1、設(shè)計(jì)任務(wù) 設(shè)計(jì)一個(gè)簡(jiǎn)易的計(jì)算器,可以進(jìn)行四則運(yùn)算:加、減、乘、除等(限于十進(jìn)制下) 程序要求: (1)應(yīng)具有相應(yīng)的界面,可參考Windows操作系統(tǒng)自帶的計(jì)算器界面。(2)操作符號(hào)定為:“+”,“-”,“*”,“/”,“+/-”等。(按國際慣例設(shè)計(jì))(3)用戶通過點(diǎn)擊程序界面上按鈕,實(shí)現(xiàn)數(shù)字、運(yùn)算符的輸入操作。(4)以上部分為必須完成的內(nèi)容。選作部分: (1)具有操作符號(hào)“1/x”,“sqrt”(開方),“.”(小數(shù)功能)等。 2.2、課程設(shè)計(jì)要求: (1)應(yīng)用自己所學(xué)課程知識(shí)完成對(duì)計(jì)算器的基本任務(wù)。 (2)查閱相關(guān)資料,學(xué)習(xí)和掌握項(xiàng)目中涉及的新知識(shí),提高自學(xué)能力。 (3)通過應(yīng)用java程序編寫計(jì)算器來提升自己對(duì)簡(jiǎn)單的圖形界面有一定的掌握和了解。 2.3、需求分析 1.設(shè)計(jì)的計(jì)算器可以完成加法、減法、乘法、除法的簡(jiǎn)單運(yùn)算。2.實(shí)現(xiàn)一些簡(jiǎn)單的擴(kuò)展運(yùn)算,如:正負(fù)號(hào)、倒數(shù)、退格、清零等功能。 頁 第 2--計(jì)算器 Java實(shí)習(xí)報(bào)告3.添加小數(shù)點(diǎn)功能,用以實(shí)現(xiàn)浮點(diǎn)型數(shù)據(jù)的計(jì)算。 4.使用布局管理器設(shè)計(jì)一個(gè)計(jì)算器的界面,使用事件監(jiān)聽器處理數(shù)據(jù)的輸入,并完成相關(guān)的計(jì)算。 三、開發(fā)工具與平臺(tái) 3.1、開發(fā)工具 Microsoft Windows 7旗艦版 3.2、開發(fā)平臺(tái) JDK1.6.0-02 和UE編譯器 頁 第 3--計(jì)算器 Java實(shí)習(xí)報(bào)告 四、設(shè)計(jì)思路 4.1、界面設(shè)計(jì):(如圖3-1) 圖3-1 4.2.1、邏輯設(shè)計(jì): (1)根據(jù)所設(shè)計(jì)出來的界面,首先要設(shè)計(jì)其GUI界面,總體界面有一個(gè)文本框,20個(gè)按鈕,總體界面用BorderLayout布局,文本框放置在最NORTH,然后0到9以及+,-,*,/等按鈕放置到一個(gè)面板Panel中,完成界面設(shè)計(jì)。 (2)設(shè)計(jì)計(jì)算流程,首先點(diǎn)擊數(shù)字按鈕時(shí),將按鈕數(shù)值添加到文本框當(dāng)中,并將該數(shù)值保存到一個(gè)字符串中,再次點(diǎn)擊數(shù)字按鈕時(shí),將之前保存的字符串與新的數(shù)值拼接起來,再添加到文本框當(dāng)中,直到點(diǎn)擊運(yùn)算符按鈕時(shí),將文本框當(dāng)中的字符串保存在一個(gè)字符串變量中,然后重置文本框內(nèi)容,將運(yùn)算符號(hào)顯示到文本框中,隨后輸入第二個(gè)計(jì)算數(shù)據(jù)時(shí),用同樣的辦法保存數(shù)據(jù),最后通過控制“=”運(yùn)算符先將字符串?dāng)?shù)據(jù)轉(zhuǎn)化成雙精度類型,然后計(jì)算出結(jié)果并顯示到文本框當(dāng)中。 (3)基本運(yùn)算設(shè)計(jì)完成以后則開始考慮其他個(gè)別功能的實(shí)現(xiàn),例如倒數(shù)、清零、退格等功能的實(shí)現(xiàn),清零直接重置文本框內(nèi)容,退格功能則采用substring函數(shù)截取字符串長度。 頁 第 4--計(jì)算器 Java實(shí)習(xí)報(bào)告 4.2.2、程序流程圖: 4.2.3、主要代碼展示及說明: 總體代碼的設(shè)計(jì): 程序采用繼承windowadapter類,新建Jframe窗體,利用數(shù)組來定義JBotton按鈕,同時(shí)利用數(shù)組注冊(cè)監(jiān)聽,采用4行5列網(wǎng)格布局,完成計(jì)算器界面的基本設(shè)置,在窗體的正常關(guān)閉方面,采用匿名類實(shí)現(xiàn)窗體的正常關(guān)閉。最后對(duì)按鈕進(jìn)行計(jì)算分析,分別設(shè)定輸入數(shù)據(jù)的A類、運(yùn)算符控制的Opertion類,退格功能的BackSpace類、計(jì)算結(jié)果的Result類等等,一步步實(shí)現(xiàn)計(jì)算器的基本功能! (1)類A的設(shè)計(jì)(數(shù)據(jù)的輸入) class A implements ActionListener { public void actionPerformed(ActionEvent e){ String a = Jtext.getText(); String s = e.getActionCommand(); if(a.equals(“0.”)||a.equals(“+”)||a.equals(“-”)||a.equals(“*”)||a.equals(“/”)) 頁 第 5--計(jì)算器 Java實(shí)習(xí)報(bào)告 } } Jtext.setText(s);else { if(flag2){ Jtext.setText(s); flag2=false;} else Jtext.setText(a+s);} 功能解釋:程序開始時(shí),程序初始化文本框的內(nèi)容為“0.”,點(diǎn)擊數(shù)字按鈕,則調(diào)用類A,首先用a來獲取當(dāng)前文本框內(nèi)容,s來獲取按鈕數(shù)值,然后進(jìn)行判斷,若a的值為上述代碼的值則輸出s的值,再次點(diǎn)擊數(shù)字按鈕時(shí),再次調(diào)用A類,此時(shí)a的值為上次輸入的s值,第一個(gè)if語句不滿足,執(zhí)行下個(gè)if語句if(flag2),flag2初始值為false,該語句的功能是在執(zhí)行了“=”號(hào)按鈕時(shí),防止新的數(shù)字按鈕的值合并到到已經(jīng)得出的結(jié)果上,例如:12+12=24,此時(shí)再點(diǎn)擊數(shù)字按鈕3時(shí),則文本框內(nèi)容被重置,輸出數(shù)值3,而不是243,如果if(flag2)不滿足,則將字符串a(chǎn)和s合并并輸出,得出第一個(gè)要計(jì)算的數(shù)據(jù)。 (2)類Opertion的設(shè)計(jì):(運(yùn)算符的控制) class Opertion implements ActionListener { public void actionPerformed(ActionEvent e){ cal=e.getActionCommand(); if(flag1==true) x=Jtext.getText(); Jtext.setText(cal); flag1=false;} 頁 第 6--計(jì)算器 Java實(shí)習(xí)報(bào)告 } 功能解釋:當(dāng)點(diǎn)擊運(yùn)算符控制按鈕時(shí),首先將運(yùn)算符的數(shù)值賦值給cal(初值為空),緊接著進(jìn)行判斷,flag1初值為ture,該類的作用為在點(diǎn)擊運(yùn)算符按鈕時(shí),將計(jì)算的第一個(gè)數(shù)據(jù)保存在x字符串變量當(dāng)中,然后將文本框內(nèi)容重置為點(diǎn)擊的運(yùn)算符的數(shù)值,類的結(jié)尾將flag1賦值為false,防止再次點(diǎn)擊運(yùn)算符按鈕時(shí)改變了x的值。 (附:此時(shí)文本框內(nèi)容為運(yùn)算符的值,輸入第二個(gè)計(jì)算數(shù)據(jù)時(shí),點(diǎn)擊數(shù)字按鈕,則再次調(diào)用A類,此時(shí)滿足A類中第一個(gè)if語句,文本框內(nèi)容被重置為數(shù)字按鈕的值,接下來與獲取第一個(gè)計(jì)算數(shù)據(jù)步驟一樣,直到點(diǎn)擊“=”號(hào)運(yùn)算符為止!) (3)類Result的設(shè)計(jì):(計(jì)算并輸出結(jié)果) class Result implements ActionListener //計(jì)算并顯示結(jié)果 { public void actionPerformed(ActionEvent e){ double num1; num1=Double.parseDouble(x); y=Jtext.getText(); double num2; num2=Double.parseDouble(y); double result=0; if(num2!=0) { if(cal.equals(“+”)) result=num1+num2; if(cal.equals(“-”)) result=num1-num2; if(cal.equals(“*”)) result=num1*num2; String s1=Double.toString(result); Jtext.setText(s1); } if(cal.equals(“/”)) 頁 第 7--計(jì)算器 Java實(shí)習(xí)報(bào)告 } { if(num2==0) Jtext.setText(“除數(shù)不能為0”); else { result=num1/num2; String s1=Double.toString(result); Jtext.setText(s1); } } flag1=true; flag2=true;} 功能解釋:首先定義兩個(gè)Double型num1,num2,將之前保存的第一個(gè)計(jì)算數(shù)據(jù)x強(qiáng)制轉(zhuǎn)換為Double型后賦值給num1,接著用字符串變量y來獲取當(dāng)前文本框的內(nèi)容,即第二個(gè)計(jì)算數(shù)據(jù)的值,同樣再將其強(qiáng)制轉(zhuǎn)換Double型后賦值給num2,然后進(jìn)行運(yùn)算符判斷,對(duì)cal的值進(jìn)行比較,然后進(jìn)行相應(yīng)的計(jì)算,將計(jì)算的結(jié)果轉(zhuǎn)換成字符串后將其輸出到文本框中,在類的最后將flag1、flag2賦值為true,作用是將計(jì)算的結(jié)果當(dāng)作第二次計(jì)算的數(shù)據(jù)進(jìn)行再運(yùn)算,即將結(jié)果重新賦值給x作為第一個(gè)計(jì)算數(shù)據(jù)!(附:在此類中還考慮了當(dāng)除數(shù)為零的情況。) (4)類BackSpace的設(shè)計(jì):(功能類—退格) class BackSpace implements ActionListener { public void actionPerformed(ActionEvent e){ String s = e.getActionCommand(); String s1 = Jtext.getText(); if(s.equals(“退格”)) s1=new String(s1.substring(0,s1.length()-1)); Jtext.setText(s1);} } 頁 第 8--計(jì)算器 Java實(shí)習(xí)報(bào)告 功能解釋:這是計(jì)算器附加功能的實(shí)現(xiàn),這里只介紹退格功能,像正負(fù)號(hào)、求倒數(shù)、清零等功能相似,所以就不再一一介紹。首先獲取退格按鈕的命令值賦給s,然后獲取當(dāng)前文本框的內(nèi)容,即輸入的數(shù)據(jù),將其賦給s1,接著進(jìn)行判斷,利用substring函數(shù)將s1字符串截取為從第一個(gè)字符至倒數(shù)第二個(gè)字符為止的字符串并重新賦值給s1,再將其輸出到文本框,實(shí)現(xiàn)退格的功能。 第 9 頁 10--計(jì)算器 Java實(shí)習(xí)報(bào)告 4.3、程序測(cè)試 1.簡(jiǎn)單的運(yùn)算:(以加法為例:123+456) 分析:計(jì)算的結(jié)果為579.0,為雙精度型,計(jì)算的結(jié)果被設(shè)置在文本框的最右端,該計(jì)算器的一個(gè)特點(diǎn)是可直接在文本框中輸入數(shù)據(jù)以及進(jìn)行更改。 2.倒數(shù)的運(yùn)算:(以123為例) 分析:輸出的結(jié)果如圖所示,倒數(shù)功能實(shí)現(xiàn),計(jì)算時(shí),不僅是結(jié)果,輸入的數(shù)據(jù)同樣可以先實(shí)現(xiàn)倒數(shù)功能后再進(jìn)行相應(yīng)的計(jì)算,沒有影響! 3.退格的運(yùn)算:(以123為例) 分析:輸出的結(jié)果如圖所示,本計(jì)算器退格鍵有一個(gè)特點(diǎn)是,就算是是計(jì)算后得出的結(jié)果也能實(shí)現(xiàn)退格,缺點(diǎn)是不能很好的處理小數(shù)點(diǎn)的問題,因?yàn)樾?shù)點(diǎn)也是字符串的一部分。 頁 第 10--計(jì)算器 Java實(shí)習(xí)報(bào)告 4.正負(fù)號(hào)的運(yùn)算:(以123為例) 分析:輸出的結(jié)果如圖所示,正負(fù)號(hào)添加能夠很好的實(shí)現(xiàn),但可以進(jìn)行一些改進(jìn),比如在計(jì)算過程當(dāng)中直接點(diǎn)擊負(fù)號(hào)運(yùn)算符輸入負(fù)數(shù)進(jìn)行計(jì)算! 5.總體分析: 該計(jì)算器基本運(yùn)算沒有問題,清零、正負(fù)號(hào)、求倒數(shù)、退格功能都能很好的實(shí)現(xiàn),總體能完成一個(gè)計(jì)算器的基本功能,但仍有許多地方需要改進(jìn),比如小數(shù)點(diǎn)的實(shí)現(xiàn)所存在的一些問題,雖然在基本的運(yùn)算過程當(dāng)中不會(huì)造成太大影響,但這依然不能認(rèn)為是一個(gè)很好的計(jì)算器,同時(shí),在另一方面,該計(jì)算器還沒能很好的實(shí)現(xiàn)連續(xù)計(jì)算的功能,必須每次按下等號(hào)按鈕計(jì)算出結(jié)果后才能用產(chǎn)生的結(jié)果接著進(jìn)行下一次的計(jì)算,改進(jìn)的方法是在運(yùn)算符上同時(shí)注冊(cè)Result類,讓運(yùn)算符同時(shí)擁有計(jì)算結(jié)果的功能。 五、實(shí)驗(yàn)小結(jié) 本次課程設(shè)計(jì)到此算是告一段落了,經(jīng)過這次的學(xué)習(xí),我學(xué)到了很多東西,在此基礎(chǔ)上更加鞏固了自己對(duì)java的認(rèn)識(shí)與了解。 在做本項(xiàng)目是時(shí)候,會(huì)遇到很多小問題,比如說,在整個(gè)運(yùn)算過程中要如何確保輸入的計(jì)算數(shù)據(jù)哪個(gè)是第一個(gè)計(jì)算數(shù)據(jù)的,哪個(gè)是第二個(gè)計(jì)算 頁 第 11--計(jì)算器 Java實(shí)習(xí)報(bào)告數(shù)據(jù)的,同時(shí)也要區(qū)分運(yùn)算符,因?yàn)樵撚?jì)算器程序應(yīng)用的都是利用字符串來完成計(jì)算的,而且不能重復(fù)輸出運(yùn)算符,更不能將運(yùn)算符錯(cuò)誤的存儲(chǔ)在了第一個(gè)計(jì)算數(shù)據(jù)的數(shù)值中,也得考慮到萬一不小心重復(fù)點(diǎn)擊了運(yùn)算符按鈕會(huì)不會(huì)造成第一個(gè)計(jì)算數(shù)據(jù)的重新賦值等等問題,最后想到利用布爾類型來很好的控制運(yùn)算符的應(yīng)用! 此次課程設(shè)計(jì)讓我更了解熟悉了Java中的圖形用戶界面和它的編程方式。在完成課題的過程中也不斷充實(shí)了自己,學(xué)習(xí)到了很多以前沒有學(xué)習(xí)到的知識(shí),收獲很大。最大的收獲就是對(duì)大學(xué)學(xué)習(xí)的總結(jié)和培養(yǎng)了解決困難的信心和能力,使我對(duì)所學(xué)知識(shí)能夠融會(huì)貫通,又不斷豐富了新知識(shí)。Java計(jì)算器設(shè)計(jì)使得我們對(duì)所學(xué)的專業(yè)課有了更為深刻的認(rèn)識(shí),使得知識(shí)得到了鞏固和提高。 在接下來的時(shí)間里,我覺得我要更加努力的往深一層次的方面看齊,了解更多有關(guān)java的知識(shí),對(duì)java有更深一步的了解,我會(huì)一步一步的走下去! 六、附錄(程序代碼)import java.awt.*;import javax.swing.*;import java.awt.event.*; public class TheCalculator extends WindowAdapter //程序框架繼承自WindowAdapter類 { private JTextField Jtext=new JTextField(“0.”);private JFrame f=new JFrame(“計(jì)算器-趙磊”);private String x=“";private String y=”“;private String cal=”“;private boolean flag1=true;private boolean flag2=false; public void init()//初始化 { String[] buttonValue = new String[]{”1“,”2“,”3“,”+“,”C“,”4“,”5“,”6“,”-“,”退格 頁 第 12--計(jì)算器 Java實(shí)習(xí)報(bào)告“,”7“,”8“,”9“,”*“,”1/x“,”0“,”+/-“,”.“,”/“,”=“}; Container contain = f.getContentPane(); JPanel Jpan = new JPanel(); JButton[] Jb=new JButton[20]; contain.setLayout(new BorderLayout());//采用4行5列的網(wǎng)格布局 Jpan.setLayout(new GridLayout(4,5)); Jtext.setHorizontalAlignment(JTextField.RIGHT); contain.add(Jtext,”North“); contain.add(Jpan); A num=new A();//數(shù)據(jù) Result re=new Result();//結(jié)果 Opertion op=new Opertion();//運(yùn)算符 Clear cl=new Clear();//清零 BackSpace back=new BackSpace();//退格 CountDown count_d=new CountDown();//倒數(shù) Strains stra=new Strains();//相反數(shù) for(int i = 0;i { Jb[i] = new JButton(buttonValue[i]); Jpan.add(Jb[i]); if(i==3 || i==8 || i==13 || i==18) Jb[i].addActionListener(op); if(i==0 || i==1 || i==2 || i==5 || i==6 || i==7|| i==10 || i==11 || i==12 || i==15 || i==17) Jb[i].addActionListener(num); if((i==3||i==4||i==8||i==9)||((i>12)&&(i<=19))&&i!=15) Jb[i].setForeground(new Color(255, 0, 0)); else Jb[i].setForeground(new Color(0, 0, 255));//控制按鈕字體顏色 } Jb[4].addActionListener(cl); Jb[9].addActionListener(back); Jb[14].addActionListener(count_d); Jb[16].addActionListener(stra); Jb[19].addActionListener(re); f.setSize(320,240); f.setVisible(true); f.addWindowListener(//采用匿名類實(shí)現(xiàn)窗口的正常關(guān)閉 new WindowAdapter() 頁 第 13--計(jì)算器 Java實(shí)習(xí)報(bào)告 { public void windowClosing(WindowEvent e) { System.exit(0); } });} class A implements ActionListener //輸入數(shù)據(jù) { public void actionPerformed(ActionEvent e){ String a = Jtext.getText(); String s = e.getActionCommand(); if(a.equals(”0.“)||a.equals(”+“)||a.equals(”-“)||a.equals(”*“)||a.equals(”/“)) Jtext.setText(s); else { if(flag2) { Jtext.setText(s); flag2=false; } else Jtext.setText(a+s); } } } class Opertion implements ActionListener { public void actionPerformed(ActionEvent e){ cal=e.getActionCommand(); if(flag1==true) x=Jtext.getText(); Jtext.setText(cal); flag1=false;} } 頁 第 14--計(jì)算器 Java實(shí)習(xí)報(bào)告 class Clear implements ActionListener //清零功能 { public void actionPerformed(ActionEvent e){ Jtext.setText(”0.“);} } class CountDown implements ActionListener //求倒數(shù)類 { public void actionPerformed(ActionEvent e){ String s = e.getActionCommand(); String s1 = Jtext.getText(); if(s.equals(”1/x“)) s1 = new String(”“+1/Double.parseDouble(s1)); Jtext.setText(s1);} } class Strains implements ActionListener //求相反數(shù)類 { public void actionPerformed(ActionEvent e){ String s = e.getActionCommand(); String s1 = Jtext.getText(); if(s.equals(”+/-“)) s1=new String(”“+(0-Double.parseDouble(s1))); Jtext.setText(s1);} } class BackSpace implements ActionListener //退格功能 { public void actionPerformed(ActionEvent e){ String s = e.getActionCommand(); String s1 = Jtext.getText(); if(s.equals(”退格“)) s1=new String(s1.substring(0,s1.length()-1)); Jtext.setText(s1);} 頁 第 15--計(jì)算器 Java實(shí)習(xí)報(bào)告 } class Result implements ActionListener //計(jì)算并顯示結(jié)果 { public void actionPerformed(ActionEvent e){ double num1; num1=Double.parseDouble(x); y=Jtext.getText(); double num2; num2=Double.parseDouble(y); double result=0; if(num2!=0) { if(cal.equals(”+“)) result=num1+num2; if(cal.equals(”-“)) result=num1-num2; if(cal.equals(”*“)) result=num1*num2; String s1=Double.toString(result); Jtext.setText(s1); } if(cal.equals(”/“)) { if(num2==0) Jtext.setText(”除數(shù)不能為0"); else { result=num1/num2; String s1=Double.toString(result); Jtext.setText(s1); } } flag1=true; flag2=true;} } public static void main(String[] args)//main方法 { 頁 第 16--計(jì)算器 Java實(shí)習(xí)報(bào)告 } } TheCalculator count=new TheCalculator();count.init(); 頁 第 17第五篇:java課程設(shè)計(jì)報(bào)告—計(jì)算器