用Jbuilder9開發媒體播放器
JBuilder9是一款功能強大的集成開發環境,支持Sun的J2SE1.4,能夠快速生成程序框架、設計圖形界面、調試程序等,也能夠快速開發包括各種復雜的企業級應用系統。使用JBuilder進行Java應用程序開發,可以極大地加快生手的學習速度,縮短熟手的開發時間。本文將通過編寫一個媒體播放器來介紹如何使用JBuilder9。| 閱讀導航 | |
| 一、概述 | |
| 二、JMF軟件包 | 1、JMF軟件包的功能 |
| 2、JMF軟件包的安裝 | |
| 3、在Jbuilder 9中使用JMF軟件包 | |
| 三、多媒體系統設計規劃 | |
| 四、多媒體界面設計 | 1、主界面設計 |
| 2、輔助界面設計 | |
| 五、媒體播放器功能實現 | 1、實現界面 |
| 2、設計菜單 | |
| 3、播放 | |
| 源代碼下載 | |
一、概述
在閱讀導航中下載源代碼,然后JBuilder9中運行程序,就會出現“Java視頻播放系統”的主界面,如圖1所示。

這是一個菜單驅動的多媒體應用程序,它的菜單欄包含“文件”、“播放”和“幫助”。“文件”包含兩個子菜單:“打開”和“退出”。“播放”菜單包含“循環播放”子菜單。“幫助”菜單包含“關于”子菜單項,用來向用戶顯示公司和版本的信息。
二、JMF軟件包
JMF實際上是一組Java類庫,在Java的應用軟件或者小程序中實現多媒體數據的播放和采集,它包括了各種媒體應用程序接口,目前通過Java開發多媒體軟件主要使用JMF軟件包。
1、JMF簡介
JMF2.1.1是對應Java2平臺標準版(J2SE)的一種可選用的應用編程接口軟件包,支持多種媒體格式,如:M-JPEG,H.263,MP3,RTP/RTSP,Rich Media Format(RMF)、Quicktime,Microsoft AVI和MPEG-1等。此外,JMF 2.1.1還是一個開放的架構,開發人員靈活采用各種第三方控件,或采用自己定制的內插控件。
安裝JMF2.1.1在硬件上有些要求,不過即使現在比較垃圾的配置也能夠滿足需要;系統要求在win95以上,JDK1.1.3以上。
2、JMF的安裝步驟:
在介紹完了JMF軟件包之后,下面就要在Windows 2000平臺上安裝JMF 2.1.1e軟件包了,步驟如下:
(1)在SUN網站上下載JMF 2.1.1e軟件包。
(2)運行JMF安裝程序,解壓JMF類庫到一個目錄下,比如D:JMF2.1.1e。(以下將以D:JMF 2.1.1e作為JMF的安裝目錄)
(3)設置環境變量JMFHOME。在Windows 2000平臺上,右擊“我的電腦”,再單擊“屬性”,選擇“高級”標簽,然后單擊“環境變量”,設置JMFHOME=H:JMF 2.1.1e。
(4)設置環境變量CLASSPATH。設置為CLASSPATH=.;D:JMF2.1.1elibsound.jar;D:JMF2.1.1elibjmf.jar;D:JMF 2.1.1elib;必須包含JMF類庫中的sound.jar和jmf.jar這兩個jar文件。
在安裝配置完成后,通過JMF Diagnostics Applet程序來檢測JMF軟件包是否配置正確。 通過http:/java.sun.com/products/java-media/jmf/2.1.1/jmfdiagnostics.html網址來檢測本機的JMF配置。JMF Diagnostics Applet是一個JavaApplet小程序,它可以搜索本地的JMF類庫的配置來檢測是否正確配置了JMF軟件包。
3、在Jbuilder 9中使用JMF軟件包
JBuilder9的Java編譯器是JDK 1.4.1 02-b06,其中沒有集成JMF軟件包。因此要需要在JBuilder中添加JMF類庫。在JBuilder 9中添加JMF類庫的過程如下。
(1)運行JBuilder9,選擇Tool菜單下的Configure Libraries菜單項,彈出Configure Libraries對話框,如圖2。左邊列表框列出了JBuilder 9所使用的類庫。單擊左邊的New按鈕來添加JMF類庫。

(2)在彈出的New Library Wizard對話框。
在Name文本框中輸入JMF,在Location下列表拉框中選擇JBuilder,然后單擊Add,在打開的對話框中來選擇JMF軟件包的安裝目錄。
(3)最后,單擊OK按鈕。
三、多媒體系統構架設計規劃
媒體播放器要有一個主窗口,以作為該視頻播放器的主操作界面。其次,還要對每個菜單項設置相應的操作:
選擇“打開”菜單項,彈出一個“打開媒體文件”的選擇對話框,用于選擇要播放的文件,如果用戶沒有選擇,則返回主界面;
選擇“退出”菜單項可自動退出程序;
對于“循環播放”菜單項是一個帶檢查框(checkable/uncheckable)的菜單項,默認狀態是未選中,表明只對播放一次,如果選擇中該菜單,則表明要進行循環播放;
選擇了“關于”菜單項,可彈出一個“關于視頻播放系統v1.0”的對話框,向用戶顯示公司和版本的信息。如下圖3所示。

下面我們就可以在JBuilder 9中來實現我們的媒體播放器了。
1、創建工程
在JBuilder 9的IDE開發環境中,通過工程向導新建一個工程(通過工具欄上的New按鈕),命名為JVideoSystem.jpx。然后,設置所需要的類庫,本例中為JMF軟件包,方法是在Required Libraries標簽頁中單擊Add按鈕,在彈出的Select One or More Libraries對話框中選擇JMF類庫。
2、創建應用程序和框架
在JVideoSystem.jpx工程中,單擊New按鈕新建一個應用程序,將應用程序的Package命名為jvideosystem,將Class name命名為JVideoPlayer。然后,將主框架/界面的Class命名為JVideoPlayerFrame,Title設為“Java媒體播放器”。在Options中選中Generate menu bar復選框;不選Generate toolbar復選框;選中Generate About dialog復選框。最后設置其他信息。
3、功能實現
在完成前面的工作之后,下面來添加相應的功能以完善該系統。
該視頻播放系統有3個類,分別是:
JVideoPlayer類----它是整個程序運行的起點;
JVideoPlayerFrame類----主界面,菜單驅動的功能都放置在這個類中;
JVideoPlayerFrame AboutBox類----輔助界面,向用戶顯示公司和版本信息。如下圖4所示。

四、多媒體界面設計
1、主界面設計
首先,對JVideoPlayerFrame這個系統的主界面進行界面設計。
雙擊圖中的JVideoPlayerFrame.java圖標,在JBuilder 9的IDE開發環境中選擇 Design標簽,進入主界面的設計器,在此將完成主界面的界面設計。界面設計器如圖5所示。

注意,JVideoPlayerFrame類(即主界面類)用this關鍵字來指代,UI目錄包含了所有的可視化部件。這里設置主界面窗口的title屬性為“ Java媒體播放器”,resizable屬性設置為False,即在程序運行時不能改變主界面窗口的大小,并且注冊windowsClosing事件監聽器this windowClosing(WindowEvent e)和windowsClosed事件監聽器this windowClosed(WindowEvent e),以在主界面窗口關閉時執行相應的程序代碼。在this下面則包含了主界面中所有的UI控件:contentPane,jLabel1,jPanelVideo。在Menu目錄下則包含了主界面的菜單欄和相應的菜單項。通過UI和Menu目錄的層次,可以清楚地看到下面各個部件之間的相互關系。
下面來看看如何設計UI和Menu。
1)contentPane“容器”設計
JBuilder9已經為主界面添加了一個JPanel類的對象contentPane,它是用來放置其他控件的“容器”,將“容器”contentPane的layout屬性設置為BorderLayout。
狀態欄設計
向主界面添加一個JLabel類的對象作為主界面的狀態欄。 在Swing控件庫中選擇JLabel拖放到contentPane上,然后設置該JLabel類對象的屬性以滿足要求。
在JBuilder9的IDE開發環境的屬性設計器中,設置該JLabel類對象的名稱為jLabell(name屬性);constraints屬性為South,即該狀態欄在contentPane中的位置在最下端;opaque屬性為True,即該狀態欄是不透明的:text屬性為“歡迎使用Java 視頻播放系統copyright@2004”,即該狀態欄顯示的文本信息;toolTipText屬性為“狀態欄”,即鼠標移動到該狀態欄上時的提示信息。其他的屬性保持默認狀態。如下圖6所示。

視頻播放窗口設計
JMF播放器對象有兩個部件:視覺部件,用戶選擇的媒體文件將在視覺部件中播放;控制面板部件,用于控制媒體文件的播放進度、媒體文件回放和聲音的開關等。
首先要向contentPane容器中添加一個JPanel類的對象jPanelVideo,JMF播放器的視覺部件和控制面板部件就放置在jPanelVideo對象中,然后再將jPanelVideo對象放置在contentPane容器中。
從Swing containers控件庫中選擇JPanel拖放到comemPane中,并且設置它的屬性。name屬性為jPanelVideo;constraints屬性為Center,即jPanelVideo在comemPane的中央:layout屬性為BorderLayout;opaque屬性為True,即不透明:toolTipText屬性為“視頻窗口”,即鼠標移動到該控件上時顯示的提示信息。其他屬性保持默認狀態。
2)菜單欄設計
在JBuilder9中設計菜單是非常方便的。
在創建應用程序時選擇了Generate menubar,JBuilder9會自動生成菜單欄jMenuBar1,我們要做的就是在菜單欄中添加相應的菜單和菜單項。
在jMenuBar1中依次添加“文件”菜單----jMenuFile、“播放”菜單----jMenuPlay、“幫助”菜單----jMenuHelp,然后在“文件”菜單中依次添加“打開”菜單項----jMenuFile open、“退出”菜單項----jMenuFile exit,在“播放”菜單中添加帶檢查框的“循環播放”菜單項----jCheckBoxMenultem_loop,在“幫助”菜單中添加“關于”菜單項----jMenuHelp_about。如圖7所示。

接下來,在屬性設計器的Events標簽頁中添加每個菜單項的動作事件,以觸發相應事件。對于“打開”菜單項,注冊jMenuFile_open_actionPerformed(actionEvent e)監聽器;對于“退出”菜單項,注冊jMenuFile_exit_actionPerformed(actionEvent e)監聽器;對于“循環播放”菜單項,注冊CheckBoxMenultem_loop_actionPerformed(actionEvent e)監聽器;對于“關于”菜單項,注冊jMenuHelp_about_actionPerformed(actionEvent e)監聽器。
至此,主界面就設計完成了。下面要對JVideoPlayerFrame AboutBox這個系統的輔助界面進行設計。
2、輔助界面設計
輔助界面中的“容器”對象是Panel類的對象panel1,它的layout屬性為BorderLayout;在這個“容器”對象中還放置了4個Panel類的對象,它們分別是insetsPanel1,Panel2,insetsPanel2和insetsPanel3。insetsPanel的layout屬性為FlowLayout,“確定”按鈕就放置在其中;panel2的layout屬性為BorderLayout,insetsPanel2和insetsPanel3就放置在其中;insetsPanel2的layout屬性為FlowLayout,ImageLabel類的對象就放置在其中,它是一個圖標標簽:insetsPanel3的layout屬性為GridLayout,3個Label類的對象label1,label2和label3就放置在其中,這3個標簽向用戶顯示了公司和版本信息。
五、媒體播放器功能實現
1、實現界面
對于“退出”菜單項和“關于”菜單項,已注冊了菜單項監聽器,用來結束主程序和打開輔助界面窗口;同時也注冊了主界面的windowClosing和windowClosing事件監聽器,用來完成主界面窗口的關閉操作;在輔助界面窗口中,注冊了“確定”按鈕的事件監聽器,以完成輔助窗口的關閉操作和輔助界面窗口的windowClosed事件監聽器。下面就來看看它們的代碼:
1)jMenuFile_exit_actionPerformed(actionEvent e)監聽器
| //菜單“文件|退出”事件監聽器 void jMenuFile_exit_actionPerformed(ActionEvent e){ //關閉主界面窗口,退出主程序 dispose(); return; } |
2)jMenuHelp_about_actionPerformed(actionEyent e)監聽器
| //菜單“幫助|關于”事件監聽器 public void iMenuHelp_about_actionPerformed(ActionEvent e) { //創建輔助界面窗口對象 JVideoPlayerFrame_AboutBox dlg=new JVideoPlayerFrame_AboutBox(this); //設置輔助界面窗口的屬性 Dimension dlgSize=dlg.getPreferredSize(); Dimension frmSize=getSize(); Point loc=getLocation(); dlg.setLocation((frmSize.width-dlgSize.width)/2+loc.X,(frmSize. height-dlgSize.height)/2+loc.y); dlg.setModal(true); dlg.pack(); //顯示該輔助界面窗口 dlg.show(); } |
3)主界面窗口的windowCIosing事件監聽器
| void this windowClosing(WindowEvent e){ //用戶單擊窗口系統菜單的關閉按鈕,調用dispose以執行windowClosed dispose(); } |
4)主界面窗口的windowCtosed事件監聽器
| void this windowClosed(WindowEvent e){ //退出主程序 System.exit (0); } |
5)輔助界面窗口的“確定”按鈕事件監聽器
| //關閉輔助界面窗口 void cancel(){ dispose(); } //單擊“確定”按鈕后觸發關閉輔助界面窗口 public void actionPerformed(ActionEvent e){ if (e.getSource() ==buttonl){ cancel(); } } void buttonl actionPerformed(ActionEvent e){} class JVideoPlayerFrame_AboutBox_buttonl_actionAdapter implements java.awt.event.ActionListener{ JVideoPlayerFrame_AboutBox adaptee; JVideoPlayerFrame_AboutBox_buttonl_actionAdapter(JVideoPlayerFrame_AboutBoxadaptee){ this.adaptee=adaptee; } public void actionPerformed(ActionEvent e}{ adaptee.buttonl actionPerformed(e); } |
6)輔助界面窗口的windowClosed事件監聽器
| //重載退出程序 protected void processWindowEvent(WindowEvent e){ if(e.getID() == WindowEvent.WINDOW_CLOSING){ cancel(); } super.processWindowEvent(e); } |
2、設計菜單
當我們注冊了菜單項監聽器,每個菜單項都有一個監聽器,以監聽菜單項是否有動作發生,如果有動作觸發就執行相應的程序代碼。完成“打開”菜單項的動作觸發代碼,注冊的監聽器為jMenuFile_open_actionPerformed(ActionEvent e),用于創建一個“打開媒體文件”對話框。下面來看看具體的代碼實現。
首先在JVideoPlayerFrame類中聲明如下幾個變量:
| Player player; Component visualcom,controlcom; boolean first=true,loop=false; String currentDirectory; FileDialog fd; |
player變量是Player類的對象,它是JMF的播放器對象:Visualcom和controlcom是Component類的對象,分別表示視覺部件和控制面板部件:loop表示是否循環播放,first表示只播放一次;currentDirectoly表示對話框的當前目錄設置為上次關閉時的目錄;fd是FileDialog類的對象,表示打開媒體文件對話框。
下面來看看“打開”菜單項的動作觸發執行的代碼:
| //打開文件 public void_jMenuFile_open_actionPerformed(ActionEvent e){ //先創建一個對話框對象,標題設置為“打開媒體文件” FileDialog fd=new FileDialog(this,"打開媒體文件",FileDialog.LOAD); //然后設置該對話框的當前目錄為上一次打開的目錄 fd.setDirectory(currentDirectory); //調用show函數顯示該打開媒體文件對話框 fd.show (); //如果用戶放棄選擇文件,則返回 if(fd.getFile()==null) return; //設置當前目錄為對話框中打開的目錄,保存在currentDirectory變量中 currentDirectory=fd.getDirectory(); //如果JMF播放器對象存在,就關閉該播放器對象 if(player!=null) player.close(); //根據指定的目錄和文件名創建一個媒體定位器(MediaLocator)對象,再利用該媒體定位器對象創建一個JMF播放器對象 try{ player =Manager.createPlayer(new MediaLocator(”file:”+fd.getDirectory() +fd.getFile())); } //捕獲異常情況 catch(java.io.IOException e2){ System.out.println(e2); return; } catch (NoPlayerException e2){ System.out.println(”不能找到播放器.”); return; } //如果創建播放器對象失敗 if (player==null){ System.out.println(”無法創建播放器.”); return; first=false; //設置主界面的標題為媒體文件的目錄名加上文件名 this.setTitle("播放文件位置"+fd.getDirectory()+fd.getFile()); //將JVideoPlayerFrame對象注冊為來自JMF播放器對象的控制器事件的動作監聽器 //player.addControllerListener(this); //最后,讓JMF播放器對象預先提取媒體文件的內容 player.prefetch(); } |
在“打開”菜單項執行相應的動作觸發代碼后,會進入到播放用戶選擇的媒體文件階段。
3、播放
當我們創建了Player類的播放器對象,并且注冊了Player 播放器對象的控制器事件的動作監聽器。下面來看看這個動作監聽器,通過它才能完成播放功能。
| public void controllerUpdate(ControllerEvent e){ //如果播放器被關閉時 if (e instanceof ControllerClosedEvent){ //如果視覺部件還存在 if(visualcom != null) { //從jPanelVideo面板中刪除該視覺部件 jPanelVideo.remove(visualcom); visualcom = null; } //如果控制面板部件還存在 if(controlcom !=null) { //從jPanelVideo面板中刪除該控制面板部件 jPanelVideo.remove(controlcom); controlcom =null; } return; } //當媒體播放結束時 if(e instanceof EndOfMediaEvent){ //如果帶檢查框的“循環播放”菜單項被選中 if(loop) { //復位JMF播放器對象的開始時間 player.setMediaTime(new Time(0)); //讓JMF播放器對象重新播放媒體 player.start(); } return; } //如果預取媒體文件內容結束時 if (e instanceof PrefetchCompleteEvent) { //讓JMF播放器對象開始播放該媒體 player.start(); reEurn; } //當實例化(Realize)媒體文件完成時 if(e instanceof RealizeCompleteEvent) { //獲取JMF播放器對象的視覺部件 visualcom =player.getVisualComponent(); //如果視覺部件存在 if(visualcom !=null) //將視覺部件加入到jPanelVideo面板的中央 jPanelVideo.add(visualcom,BorderLayout.CENTER); //獲取JMF播放器對象的控制面板部件 controlcom =player.getControlPanelComponent(); //如果控制面板部件存在 if(controlcom !=null) //將控制面板部件加入到jPanelVideo面板的底端 jPanelVideo.add(controlcom,BorderLayout.SOUTH); //執行pack操作 this.pack(); } } |
在上面的代碼中,完成了媒體文件的播放功能,對于“循環播放”菜單項注冊了菜單項監聽器CheckBoxMenultem_loop_actionPerformed(ActionEvent e),下面來看看它的動作觸發執行代碼:
| void jCheckBoxMenultem_loop_actionPerformed(ActiOnEvent e){ //將循環播放標志取反 loop =!loop; } |
對于帶檢查框的菜單項,還要注冊itemStateChanged(IternEvente)事件監聽器,以檢查該菜單項的狀態是否發生了改變。
至此我們已經完成了播放功能,也就完成了一個媒體播放器,你可以使用自己設計的媒體播放器軟件看電影和聽音樂了。