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平台
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
版(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.1e\lib\sound.jar;D:\JMF2.1.1e\lib\jmf.jar;D:\JMF 2.1.1e\lib;必须包含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){
//关闭主界面窗口,退出主程序
this.dispose();
}
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_AboutBox adaptee){
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类的对象,表示打开媒体文件对话框。
下面来看看“打开”菜单项的动作触发执行的代码:
//打开文件
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();
return;
}
//当实例化(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)事件监听器,以检查该菜单项的状态是否发生了改变。
至此我们已经完成了播放功能,也就完成了一个媒体播放器,你可以使用自己设计的媒体播放器软件看电影和听音乐了。