版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
PAGE軟件課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告(個(gè)人報(bào)告)課題:音樂(lè)播放器設(shè)計(jì)班級(jí):電信1103班成員:成俊文學(xué)號(hào):U201113148指導(dǎo)老師:許毅平老師課設(shè)評(píng)價(jià): 課設(shè)成績(jī):一、需求分析1)引言···················································32)預(yù)期功能·············································33)設(shè)計(jì)目標(biāo)·············································4二、界面方案設(shè)計(jì)說(shuō)明1)擬選用的開(kāi)發(fā)平臺(tái)和工具介紹····························42)系統(tǒng)框圖··············································53)軟件各功能模塊劃分······································64)模塊間的相互關(guān)系·····································85)開(kāi)發(fā)計(jì)劃··············································8三、詳細(xì)設(shè)計(jì)說(shuō)明1)主界面輪廓設(shè)計(jì)及初始化·······························82)界面外框和關(guān)閉最小化等的實(shí)現(xiàn)·························103)菜單添加歌曲設(shè)計(jì)·····································13菜單界面設(shè)計(jì):4)播放列表list的實(shí)現(xiàn)···································13播放列表的界面設(shè)計(jì)5)播放的控制部分·······································14播放按鈕、進(jìn)度條等的控制面板設(shè)計(jì):6)歌名、歌詞、目錄顯示的部分···························16歌詞界面設(shè)計(jì)(含有全部顯示和滾動(dòng)兩部分):四、測(cè)試過(guò)程說(shuō)明1)測(cè)試用例說(shuō)明········································182)測(cè)試情況說(shuō)明········································203)測(cè)試經(jīng)歷與想法21五、功能模塊使用說(shuō)明22六、開(kāi)發(fā)總結(jié)·············································24需求分析引言本課程《軟件課程設(shè)計(jì)》,旨在運(yùn)用所學(xué)課程中有關(guān)數(shù)據(jù)結(jié)構(gòu)、操作系統(tǒng)、數(shù)據(jù)庫(kù)系統(tǒng)知識(shí)來(lái)進(jìn)行本課程設(shè)計(jì),熟練掌握高級(jí)程序設(shè)計(jì)技術(shù),加深對(duì)課程內(nèi)容的理解、提高軟件應(yīng)用設(shè)計(jì)能力及編程和調(diào)試能力。同時(shí)加強(qiáng)學(xué)生的自我學(xué)習(xí)能力和團(tuán)隊(duì)協(xié)作能力,讓同學(xué)學(xué)會(huì)面對(duì)問(wèn)題,并學(xué)會(huì)獨(dú)立去解決問(wèn)題,也能觸發(fā)學(xué)生的創(chuàng)新能力。此次,我們班抽的任務(wù)是任選一門自己熟悉或擅長(zhǎng)喜歡的語(yǔ)言設(shè)計(jì)一個(gè)基于windows平臺(tái)的音樂(lè)播放器軟件,要能實(shí)現(xiàn)對(duì)音樂(lè)庫(kù)的管理和基本播放功能。隨著信息時(shí)代的到來(lái)以及網(wǎng)絡(luò)的日益發(fā)展,音樂(lè)播放器軟件隨處可見(jiàn),人人都在使用自己喜歡的播放應(yīng)用軟件。其中也不乏一些優(yōu)秀的成品,如酷狗、天天動(dòng)聽(tīng)、qq音樂(lè)播放器等。對(duì)于各色各樣的播放器,用戶心中都有自己的評(píng)價(jià),如今我們作為它們的使用者,以用戶的角度重新來(lái)設(shè)計(jì)一個(gè)音樂(lè)播放器,不僅要實(shí)現(xiàn)播放等最基本功能,最重要的是要提供一個(gè)良好的用戶體驗(yàn),即給使用者簡(jiǎn)潔,明了,方便,功能豐富的感受。這依賴于我們課堂知識(shí)基礎(chǔ)、課下大量的資料查閱、自主學(xué)習(xí)思考,以及小組成員之間的討論、糾正與創(chuàng)新。在我們參考了很多的播放器軟件,查閱了很多java的有關(guān)媒體播放器的知識(shí)后,我們才正式開(kāi)始設(shè)計(jì)我們自己的播放器,并有了如下的成果。預(yù)期功能**軟件基本要求1.有圖形界面;2.提供基本播放功能:播放、暫停、快進(jìn)、快退、停止;3.支持播放模式:?jiǎn)吻シ?、單曲循環(huán)、順序播放和隨機(jī)播放;4.支持播放信息顯示:歌曲名、播放時(shí)間;5.支持播放列表管理:歌曲增加、歌曲刪除、歌曲播放次序調(diào)整。**可選要求1.支持歌詞顯示和同步播放;2.支持本地歌曲搜索和管理;3.均衡器管理:支持不同風(fēng)格的音樂(lè)模式播放;4.自動(dòng)記憶播放功能(程序關(guān)閉時(shí)能記憶當(dāng)前播放的歌曲,重啟后繼續(xù)播放);5.提供更良好的操作界面;6.其他功能。3)設(shè)計(jì)目標(biāo)對(duì)于功能完成方面,力求在出色完成所有預(yù)期基本功能的基礎(chǔ)上,基本實(shí)現(xiàn)所有可選要求,并且努力創(chuàng)新出新的功能。對(duì)于用戶界面設(shè)計(jì)方面,力求簡(jiǎn)潔明了,做到即便對(duì)沒(méi)有任何編程基礎(chǔ)的人也能無(wú)障礙使用我們?cè)O(shè)計(jì)的播放器。對(duì)于程序編寫方面,力求用簡(jiǎn)單的語(yǔ)句實(shí)現(xiàn)更多復(fù)雜的功能,不重復(fù),不綴余。對(duì)于軟件穩(wěn)定方面,力求軟件運(yùn)行不出錯(cuò),力求穩(wěn)定無(wú)bug??傮w方案設(shè)計(jì)說(shuō)明開(kāi)發(fā)平臺(tái)和工具經(jīng)過(guò)小組商定,因?yàn)橹坝薪佑|過(guò)java,所以我們選用了java語(yǔ)言,而java語(yǔ)言,其本身相對(duì)于其他編程語(yǔ)言也有著非常大的優(yōu)勢(shì),作為一門面向?qū)ο蟮恼Z(yǔ)言,java具有很強(qiáng)的靈活性、模塊化、透明性、可重用性強(qiáng)的優(yōu)點(diǎn)。相對(duì)C++,java更加強(qiáng)大、健壯、安全,而且又很簡(jiǎn)單,容易入門和掌握。個(gè)人在初次接觸java之后就非常喜歡這門語(yǔ)言,之前也用java編寫過(guò)爬蟲(chóng)帶哦嗎所以我們選用了以下的開(kāi)發(fā)平臺(tái)和工具開(kāi)發(fā)平臺(tái)——JavaEclipse:Eclipse是一個(gè)開(kāi)放源代碼的、基于Java的可擴(kuò)展開(kāi)發(fā)平臺(tái)。就其本身而言,它只是一個(gè)框架和一組服務(wù),用于通過(guò)插件組件構(gòu)建開(kāi)發(fā)環(huán)境。個(gè)人覺(jué)得用eclipse寫java非??旖莘奖?,也很容易debug糾錯(cuò)。運(yùn)行平臺(tái)——Jdk(JavaDevelopmentKit):java的運(yùn)行環(huán)境。工具——windowsoffice2013:用于編寫項(xiàng)目過(guò)程計(jì)劃書、項(xiàng)目報(bào)告等。2)系統(tǒng)框圖 本人在此次軟件課設(shè)中主要負(fù)責(zé)界面設(shè)計(jì)和繪制和課設(shè)報(bào)告的代碼分析。個(gè)人認(rèn)為,音樂(lè)播放器作為一個(gè)交互性較強(qiáng)的,著重于用戶體驗(yàn)的一個(gè)應(yīng)用程序軟件,對(duì)于其界面設(shè)計(jì)的要求是比較高的,要力求簡(jiǎn)單完善,但又要功能強(qiáng)大簡(jiǎn)潔明了,讓任何一個(gè)人都可以很快的用起來(lái)得心應(yīng)手而又愛(ài)不釋手,希望用戶體驗(yàn)?zāi)苡行缕婧陀鋹偢小_@次的軟件課設(shè),本人負(fù)責(zé)界面設(shè)計(jì),所以用到了java語(yǔ)言的swing和JMF,初次使用,學(xué)到了很多東西,覺(jué)得JMF非常強(qiáng)大,對(duì)Swing也長(zhǎng)生了濃厚的興趣。本人負(fù)責(zé)的部分在系統(tǒng)框圖中顯示如下:音樂(lè)播放器音樂(lè)播放器監(jiān)聽(tīng)器設(shè)計(jì)模塊功能設(shè)計(jì)模塊界面設(shè)計(jì)模塊監(jiān)聽(tīng)器設(shè)計(jì)模塊功能設(shè)計(jì)模塊界面設(shè)計(jì)模塊界面背景圖片歌詞顯示界面播放列表界面播放控制界面歌名顯示和菜單界面背景圖片歌詞顯示界面播放列表界面播放控制界面歌名顯示和菜單界面整體框架部分界面整體框架部分基本模塊劃分1、界面整體框架劃分整個(gè)框架是用的javaswing的Frame:publicclassMusicPlayerextendsJFrame{}由于panel的雙緩沖性能,故選擇了在frame里套上一個(gè)panel,然后再在panel的基礎(chǔ)上繪制組件,并實(shí)現(xiàn)對(duì)其劃分模塊:JPanelframe=newJPanel();//偽frame,實(shí)則是panel,因?yàn)閜anel有緩沖,更有利于在其上畫組件 frame.setLayout(newBorderLayout()); this.add(frame,BorderLayout.CENTER);考慮到界面美化情況,選擇了去除原JFrame的邊框,自己繪制邊框和關(guān)閉響應(yīng)this.setUndecorated(true);//去掉frame框架加監(jiān)聽(tīng)器使邊框可以隨鼠標(biāo)移動(dòng)(原去邊框后無(wú)此功能)this.addMouseListener(newMouseAdapter(){}this.addMouseMotionListener(newMouseMotionAdapter(){}添加關(guān)閉按鈕:JButtoncloseButton=newJButton();closeButton.addActionListener(newActionListener(){}//關(guān)閉操作界面最小化到托盤的實(shí)現(xiàn),需要調(diào)用java的systemTray類:SystemTraysystemTray;systemTray=SystemTray.getSystemTray();//構(gòu)建托盤實(shí)例界面格局劃分 JSplitPanejspp1=newJSplitPane(JSplitPane.HORIZONTAL_SPLIT,true)JSplitPanejspp2=newJSplitPane(JSplitPane.VERTICAL_SPLIT,true,ctropanel,list);歌名顯示和添加菜單labelfilepath=newJLabel("播放目錄:"); labelfilename=newJLabel("播放文件:"); menubar=newJMenuBar(); menufile=newJMenu("打開(kāi)文件");menubar.add(menufile);播放控制界面按鈕組:JButtonlastBttn=newJButton("上一曲"); JButtonnextBttn=newJButton("下一曲"); JButtonplayBttn=newJButton("播放"); JButtonwaitBttn=newJButton("暫停"); JButtonquickBttn=newJButton("快進(jìn)"); JButtonslowBttn=newJButton("快退"); JButtonstopBttn=newJButton("停止");各個(gè)button會(huì)設(shè)置相應(yīng)的形狀顏色及背景圖片,加上相應(yīng)的監(jiān)聽(tīng)器播放進(jìn)度條控制:jSlider=newJSlider();音量:(最終因響應(yīng)的功能未實(shí)現(xiàn)而放棄)slider2=newJSlider(JSlider.HORIZONTAL,0,100,50); JLabellabel=newJLabel(""),//音量標(biāo)簽 label1=newJLabel("-"), label2=newJLabel("+");播放列表界面list=newList();JSplitPanejspp2=newJSplitPane(JSplitPane.VERTICAL_SPLIT,true,ctropanel,list);歌詞顯示界面全部歌詞顯示界面:textArea=newJTextArea(); textArea.setFont(newFont("宋體",Font.ITALIC,15));滾動(dòng)歌詞顯示界面:lyricsJTextField=newJTextField();lyricsJTextField.setFont(newFont("serif",Font.BOLD,20));6、界面背景圖片背景圖片重繪:publicvoidpaint(Graphicsg){ g.drawImage(image,0,0,this.getSize().width,this.getSize().height,this); super.paint(g);}4)模塊間的相互關(guān)系監(jiān)聽(tīng)器模塊實(shí)現(xiàn)對(duì)鼠標(biāo)的監(jiān)聽(tīng),當(dāng)鼠標(biāo)點(diǎn)擊界面上設(shè)置的不同功能按鍵時(shí),由監(jiān)聽(tīng)器進(jìn)入不同的功能模塊,實(shí)現(xiàn)具體的功能。而鼠標(biāo)點(diǎn)擊的界面按鍵是由界面設(shè)計(jì)模塊完成,同時(shí)功能模塊中的歌詞模塊和播放列表管理模塊的可視性也是由界面設(shè)計(jì)模塊完成的??傮w而言,各個(gè)模塊互相依賴,彼此支持,缺一不可。5)開(kāi)發(fā)計(jì)劃6-7周確定項(xiàng)目功能,分配任務(wù)8-11周個(gè)人根據(jù)個(gè)人任務(wù)學(xué)習(xí),查閱資料12周設(shè)定基本框架和方案13周考試周不作安排14周對(duì)最初的模板進(jìn)行討論完善,完成期中報(bào)告15-16周各自開(kāi)發(fā)16-17周集中開(kāi)發(fā)18周各個(gè)模塊調(diào)試、測(cè)試,就現(xiàn)實(shí)的完成程度討論優(yōu)化及方案詳細(xì)設(shè)計(jì)說(shuō)明代碼程序分析主界面輪廓設(shè)計(jì)及初始化privatestaticfinallongserialVersionUID=1L; privatelongtime=0; privateintN=0; privateintmemorytime=0; privatelongjumpSecond=5000000; privateStringlrc; privatelonglrctime; privatelongsongtime; privateintfileIndex=0; booleanisStop=true;//控制播放線程 booleanhasStop=true;//播放線程狀態(tài) booleanisPause=false; booleanhasPause=false; Stringitem1; Stringitem2; Stringfilepath;//播放文件目錄 Stringfilename;//播放文件名稱 AudioInputStreamaudioInputStream;//音頻文件流 AudioFormataudioFormat;//音頻文件格式 privateClipclip;//接口:源數(shù)據(jù)行,可以寫入音頻數(shù)據(jù) Listlist;//文件列表 JTextAreatextArea; JMenuBarmenubar; JMenumenufile; JMenuItemmenuopensong; JPanelpanelmain; Containercontainer; JPanelpaneright; MenuItemmenu_add;MenuItemmenu_del; JTextFieldtextField; JTextFieldlyricsJTextField; Containercontainer2; PopupMenupopupMenu; JLabellabelfilepath;//播放目錄顯示標(biāo)簽 JLabellabelfilename;//播放文件顯示標(biāo)簽 staticinttesttimethread=0; TimeThreadtimeThread; privateTimertimer; privateJLabelstartPoint; privateJLabelendPoint; JSliderjSlider; JSliderslider2; intxOld=0;intyOld=0;SystemTraysystemTray;2)界面外框和關(guān)閉最小化等的實(shí)現(xiàn)this.setLayout(newBorderLayout()); this.setTitle("音樂(lè)播放器"); this.setSize(800,600); this.setUndecorated(true);//去掉frame框架 this.setVisible(true);//最下面也有一行次代碼,最好是保留那一行的 ImageIconicon=newImageIcon("Image\\player.jpg");this.setIconImage(icon.getImage());//設(shè)置應(yīng)用程序的圖標(biāo)顯示//添加監(jiān)聽(tīng)器使窗體可以移動(dòng)this.addMouseListener(newMouseAdapter(){publicvoidmousePressed(MouseEvente){ xOld=e.getX();//得到鼠標(biāo)的位置yOld=e.getY(); } });this.addMouseMotionListener(newMouseMotionAdapter(){publicvoidmouseDragged(MouseEvente){intxOnScreen=e.getXOnScreen();intyOnScreen=e.getYOnScreen();intxx=xOnScreen-xOld; intyy=yOnScreen-yOld; MusicPlayer.this.setLocation(xx,yy); }});//去掉了框體,所以要自己加一個(gè)關(guān)閉按鈕,此關(guān)閉按鈕實(shí)則是實(shí)現(xiàn)最小化到托盤JButtoncloseButton=newJButton();closeButton.setIcon(newImageIcon("Image\\close.jpg"));//設(shè)置托盤圖標(biāo)closeButton.setPreferredSize(newjava.awt.Dimension(30,27));closeButton.setContentAreaFilled(false); closeButton.setBorder(null); closeButton.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ dispose();//如果點(diǎn)擊按鈕則關(guān)閉窗體但不關(guān)閉應(yīng)用程序 } });//托盤的右鍵菜單的添加和實(shí)現(xiàn) PopupMenupop=newPopupMenu();//構(gòu)造一個(gè)右鍵彈出式菜單 MenuItemshow=newMenuItem("打開(kāi)程序(s)"); MenuItemexit=newMenuItem("退出程序(x)"); pop.add(show); pop.add(exit); ImageIconimage=newImageIcon("Image\\player.jpg");//設(shè)置托盤圖標(biāo) TrayIcontrayIcon=newTrayIcon(image.getImage(),"MusicPlayer!",pop);//設(shè)置托盤的圖標(biāo),延時(shí)顯示內(nèi)容,添加右鍵菜單 trayIcon.setImageAutoSize(true);//顯示圖標(biāo) trayIcon.isImageAutoSize(); systemTray=SystemTray.getSystemTray();//構(gòu)建托盤實(shí)例 try{ systemTray.add(trayIcon); }catch(AWTExceptionex){ System.out.println("系統(tǒng)托盤不可用"); } trayIcon.addMouseListener(newMouseAdapter(){ publicvoidmouseClicked(MouseEvente){ if(e.getClickCount()==2)//雙擊托盤窗口再現(xiàn) setVisible(true); //systemTray.remove(trayIcon);//從系統(tǒng)的托盤實(shí)例中移除托盤圖標(biāo) } }); show.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ //systemTray.remove(trayIcon);//從系統(tǒng)的托盤實(shí)例中移除托盤圖標(biāo) setVisible(true);//顯示窗口 } }); exit.addActionListener(newActionListener()//點(diǎn)擊“退出演示”菜單后退出程序 { publicvoidactionPerformed(ActionEvente){ FileWriterfw1=null;//退出時(shí)保存當(dāng)前播放信息 try{ fw1=newFileWriter("D:\\MusicPlayer_log.txt"); }catch(IOExceptione1){ e1.printStackTrace(); }//setroute BufferedWriterbw1=newBufferedWriter(fw1); try{ bw1.write("list_number="); Stringn=String.valueOf(N); bw1.write(n); bw1.newLine(); bw1.write("filepath="); bw1.write(filepath); bw1.newLine(); bw1.write("song="); bw1.write(list.getSelectedItem()); bw1.newLine(); bw1.write("time="); Stringplaytime=String.valueOf(toMillisecond(clip.getMicrosecondPosition())); bw1.write(playtime); bw1.flush(); fw1.flush(); }catch(IOExceptione2){ e2.printStackTrace(); } FileWriterfw2=null; try{ fw2=newFileWriter("D:\\list_log.txt"); }catch(IOExceptione3){ e3.printStackTrace(); }//setroute BufferedWriterbw2=newBufferedWriter(fw2); try{ inti=0; while(i<N){ list.select(i); bw2.write(list.getSelectedItem()); bw2.newLine(); i++; } bw2.flush(); fw2.flush(); }catch(IOExceptione4){ e4.printStackTrace(); } System.exit(0);//退出程序 } });3)菜單添加歌曲設(shè)計(jì) menubar=newJMenuBar(); menufile=newJMenu(); menufile.setIcon(newImageIcon("Image\\addfile.png")); menuopensong=newJMenuItem("打開(kāi)歌曲"); menufile.add(menuopensong); menubar.add(menufile); menuopensong.setBackground(newColor(240,255,255)); menubar.setBackground(newColor(240,255,255)); JPanelframe=newJPanel();//偽frame,實(shí)則是panel,因?yàn)閜anel有緩沖,更有利于在其上畫組件 Borderborder=BorderFactory.createLineBorder(Color.black,1); frame.setBorder(border); frame.setLayout(newBorderLayout()); this.add(menubar,BorderLayout.SOUTH); this.add(frame,BorderLayout.CENTER); menubar.setBorder(border);4)播放列表list的界面list=newList(); popupMenu=newPopupMenu();//右鍵彈出的菜單設(shè)計(jì)添加 menu_add=newMenuItem("向列表中添加"); menu_del=newMenuItem("從列表中刪除"); popupMenu.add(menu_add); popupMenu.add(menu_del); this.add(popupMenu);5)播放的控制部分播放按鈕、進(jìn)度條等的控制面板設(shè)計(jì): panelmain=newJPanel(); JPanelctropanel=newJPanel(); //按鈕的具體繪制情況 JButtonlastBttn=newJButton("上一曲"); lastBttn.addActionListener(handler); JButtonnextBttn=newJButton("下一曲"); nextBttn.addActionListener(handler); JButtonplayBttn=newJButton("播放"); JButtonwaitBttn=newJButton("暫停"); JButtonquickBttn=newJButton("快進(jìn)"); quickBttn.addActionListener(handler); JButtonslowBttn=newJButton("快退"); slowBttn.addActionListener(handler); JButtonstopBttn=newJButton("停止"); lastBttn.setPreferredSize(newjava.awt.Dimension(60,30)); lastBttn.setContentAreaFilled(false);//只須加上此句 lastBttn.setBorder(null); lastBttn.setIcon(newImageIcon("Image\\last.png")); nextBttn.setPreferredSize(newjava.awt.Dimension(60,30)); nextBttn.setContentAreaFilled(false); nextBttn.setBorder(null); nextBttn.setIcon(newImageIcon("Image\\next.png")); playBttn.setPreferredSize(newjava.awt.Dimension(60,40)); playBttn.setContentAreaFilled(false); playBttn.setBorder(null); playBttn.setIcon(newImageIcon("Image\\play.png")); waitBttn.setPreferredSize(newjava.awt.Dimension(60,40)); waitBttn.setContentAreaFilled(false); waitBttn.setBorder(null); waitBttn.setIcon(newImageIcon("Image\\stop.png"));// stopBttn.setPreferredSize(newjava.awt.Dimension(60,40));// stopBttn.setContentAreaFilled(false);// stopBttn.setBorder(null);// stopBttn.setIcon(newImageIcon("Image\\restart.png")); stopBttn.setContentAreaFilled(false); quickBttn.setContentAreaFilled(false); slowBttn.setContentAreaFilled(false); jSlider=newJSlider(); jSlider.setValue(0); jSlider.addMouseListener(clickHandler); jSlider.addMouseMotionListener(moveHandler); timer=newTimer(100,handler); slider2=newJSlider(JSlider.HORIZONTAL,0,100,50); jSlider.setPreferredSize(newDimension(350,60)); JLabellabel=newJLabel(""),//音量標(biāo)簽 label1=newJLabel("-"), label2=newJLabel("+"); label.setOpaque(false); label.setIcon(newImageIcon("Image\\音量.png")); JComboBox<String>c=newJComboBox<String>();// c.setBackground(newColor(240,255,255)); String[]modem={"單曲播放","單曲循環(huán)","順序播放","隨機(jī)播放","列表循環(huán)"}; intcount=0; for(inti=0;i<5;i++) { c.addItem(modem[count++]); }startPoint=newJLabel("00:00"); endPoint=newJLabel("--:--"); startPoint.setSize(5,5); endPoint.setSize(5,5); startPoint.setOpaque(false); endPoint.setOpaque(false); JPanelctropanel1=newJPanel(); ctropanel1.setLayout(newBorderLayout()); ctropanel1.add(startPoint,BorderLayout.WEST); ctropanel1.add(endPoint,BorderLayout.EAST); ctropanel1.setOpaque(false); JPanelctropanel2=newJPanel(); ctropanel2.setOpaque(false); ctropanel2.setLayout(newBorderLayout()); ctropanel2.add(ctropanel1,BorderLayout.CENTER); ctropanel2.add(jSlider,BorderLayout.NORTH); ctropanel.setLayout(newBorderLayout()); ctropanel.add(ctropanel2,BorderLayout.NORTH); //按鈕控制組 container=newContainer(); container.setLayout(newGridLayout(2,1)); JPanelbttnpanel1=newJPanel();//b1主要含進(jìn)度控制按鈕 bttnpanel1.add(c); bttnpanel1.add(slowBttn); bttnpanel1.add(quickBttn); bttnpanel1.add(stopBttn); JPanelbttnpanel2=newJPanel();//b2主要含播放控制按鈕組 bttnpanel2.add(lastBttn); bttnpanel2.add(playBttn); bttnpanel2.add(waitBttn); bttnpanel2.add(nextBttn); //音量控制組 JPanelvoicepanel=newJPanel(); voicepanel.add(label); voicepanel.add(label1); voicepanel.add(slider2); voicepanel.add(label2); //設(shè)置透明,是圖片可以顯示出來(lái) jSlider.setOpaque(false); slider2.setOpaque(false); voicepanel.setOpaque(false); bttnpanel1.setOpaque(false); bttnpanel2.setOpaque(false); ctropanel.setOpaque(false); //整體布局 container.add(bttnpanel1,BorderLayout.CENTER); container.add(bttnpanel2,BorderLayout.SOUTH); ctropanel.add(container,BorderLayout.CENTER);6)歌名、歌詞、目錄顯示的部分歌詞界面設(shè)計(jì)(含有全部顯示和滾動(dòng)兩部分): //在分割窗上使用paint重繪的方法繪制圖片,添加背景圖片 JSplitPanejspp1=newJSplitPane(JSplitPane.HORIZONTAL_SPLIT,true){ ImageIconimageIcon=newImageIcon("Image\\主界面.jpg"); Imageimage=imageIcon.getImage(); { setOpaque(false); } publicvoidpaint(Graphicsg){ g.drawImage(image,0,0,this.getSize().width,this.getSize().height,this); super.paint(g);} }; frame.add(panelmain,BorderLayout.NORTH); frame.add(jspp1,BorderLayout.CENTER); labelfilepath=newJLabel("播放目錄:"); labelfilename=newJLabel("播放文件:"); labelfilepath.setPreferredSize(newjava.awt.Dimension(340,20)); labelfilename.setPreferredSize(newjava.awt.Dimension(410,20)); labelfilepath.setOpaque(false); labelfilename.setOpaque(false); closeButton.setOpaque(false); panelmain.add(labelfilepath); panelmain.add(labelfilename); panelmain.add(closeButton); panelmain.setBackground(newColor(240,255,255)); // 全部歌詞部分的顯示 textArea=newJTextArea(); textArea.enableInputMethods(false); textArea.setOpaque(false); textArea.setFont(newFont("宋體",Font.ITALIC,15)); JScrollPanejsc2=newJScrollPane(textArea); jsc2.setOpaque(false); jsc2.getViewport().setOpaque(false); jsc2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); paneright=newJPanel(); paneright.setOpaque(false);paneright.setBorder(null);//滾動(dòng)歌詞部分的顯示方式 lyricsJTextField=newJTextField(); lyricsJTextField.setOpaque(false); lyricsJTextField.setForeground(newColor(0,127,255)); lyricsJTextField.setFont(newFont("serif",Font.BOLD,20)); paneright.setLayout(newBorderLayout()); paneright.add(textArea,BorderLayout.CENTER); paneright.add(lyricsJTextField,BorderLayout.SOUTH); JSplitPanejspp2=newJSplitPane(JSplitPane.VERTICAL_SPLIT,true,ctropanel,list); jspp2.setOneTouchExpandable(true); jspp2.setDividerLocation(210); jspp2.setDividerSize(2);//設(shè)置分隔線寬度的大小,以pixel為計(jì)算單位。 jspp2.setBorder(null);// jspp2.setResizeWeight(0.1);jspp1.add(jspp2);jspp1.add(paneright);jspp1.setOpaque(false);jspp1.setContinuousLayout(true);//逐漸可以睡分割線移動(dòng)而變化jspp1.setOneTouchExpandable(true);jspp1.setDividerSize(1);jspp1.setDividerLocation(340);jspp1.setOpaque(false);jspp2.setOpaque(false);四、測(cè)試過(guò)程說(shuō)明1)測(cè)試用例說(shuō)明整體界面菜單添加歌曲右鍵添加或刪除歌曲當(dāng)前播放歌曲名和播放目錄顯示界面最小化到托盤及其右鍵菜單設(shè)計(jì)2)測(cè)試結(jié)果與測(cè)評(píng)已完成的基本功能1.圖形界面可視;2.基本播放功能:播放、暫停、快進(jìn)、快退均已實(shí)現(xiàn);3.各種播放模式:?jiǎn)吻シ?、單曲循環(huán)、順序播放、隨機(jī)播放均已實(shí)現(xiàn);4.播放列表管理:添加歌曲,刪除歌曲均已實(shí)現(xiàn);5.播放信息顯示:歌曲名,播放時(shí)間均已實(shí)現(xiàn);6.支持進(jìn)度條,拖動(dòng)進(jìn)度條可實(shí)現(xiàn)歌曲的前進(jìn),后退。已完成的拓展功能1.歌詞顯示和歌詞的同步播放均已實(shí)現(xiàn);2.支持自動(dòng)記憶播放功能(程序關(guān)閉時(shí)能記憶當(dāng)前播放的歌曲,重啟后繼續(xù)播放);3.對(duì)界面外觀進(jìn)行了優(yōu)化,界面成果優(yōu)美,簡(jiǎn)潔;4.支持用戶依據(jù)個(gè)人喜好改變界面不同分區(qū)大小的功能;5.支持界面的最小化和還原;6.支持循環(huán)播放功能;7.支持本地查看播放列表添加曲目。待改善功能1.有時(shí)候選擇不同播放模式時(shí)會(huì)出現(xiàn)死機(jī)情況;2.有極少的次數(shù),歌曲歌詞不能顯示,還不夠穩(wěn)定。測(cè)試經(jīng)歷與想法在整個(gè)軟件應(yīng)用程序設(shè)計(jì)過(guò)程之中和設(shè)計(jì)完成之后,我們都進(jìn)行了較長(zhǎng)時(shí)間的測(cè)試調(diào)節(jié)。由于對(duì)java掌握還不算透徹,對(duì)javamediaframe
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年某服裝設(shè)計(jì)與某紡織廠關(guān)于環(huán)保材料應(yīng)用的合作協(xié)議
- 2024-2030年中國(guó)衛(wèi)生消毒場(chǎng)運(yùn)行狀況及投資發(fā)展前景預(yù)測(cè)報(bào)告
- 2024年度養(yǎng)老機(jī)構(gòu)與專業(yè)護(hù)理團(tuán)隊(duì)合作協(xié)議3篇
- 2024上海應(yīng)屆生落戶離職賠償金計(jì)算及協(xié)議3篇
- 2024年版房地產(chǎn)項(xiàng)目開(kāi)發(fā)合作合同樣本版B版
- 珠海城市職業(yè)技術(shù)學(xué)院實(shí)訓(xùn)室安全事故應(yīng)急處置管理辦法(已發(fā)文)
- 滿洲里俄語(yǔ)職業(yè)學(xué)院《軟件工程原理與應(yīng)用》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025技術(shù)咨詢標(biāo)準(zhǔn)合同書
- 2025年石家莊道路貨物運(yùn)輸駕駛員考試
- 2025年福州從業(yè)資格證模擬考試題貨運(yùn)考題
- 壓力性損傷治療護(hù)理新進(jìn)展
- 大疆機(jī)場(chǎng)2操作白皮書
- 110kV變電站及110kV輸電線路運(yùn)維投標(biāo)技術(shù)方案(第二部分)
- 大班語(yǔ)言魔術(shù)喇叭
- 員工廉潔從業(yè)培訓(xùn)
- 醫(yī)療器械培訓(xùn)試題及答案
- 肺癌伴咯血護(hù)理查房
- 上海市監(jiān)理通用表
- 露營(yíng)基地旅游運(yùn)營(yíng)策劃方案相關(guān)7篇
- 2024全新《廉潔協(xié)議》-(多場(chǎng)合應(yīng)用)
- 國(guó)家開(kāi)放大學(xué)一網(wǎng)一平臺(tái)電大《可編程控制器應(yīng)用實(shí)訓(xùn)》形考任務(wù)4終結(jié)性考試題庫(kù)及答案
評(píng)論
0/150
提交評(píng)論