top
Loading...
用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)事件監聽器,以檢查該菜單項的狀態是否發生了改變。

至此我們已經完成了播放功能,也就完成了一個媒體播放器,你可以使用自己設計的媒體播放器軟件看電影和聽音樂了。


作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗