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.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){ //关闭主界面窗口,退出主程序 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_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类的对象,表示打开媒体文件对话框。
下面来看看“打开”菜单项的动作触发执行的代码:
| //打开文件 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)事件监听器,以检查该菜单项的状态是否发生了改变。
至此我们已经完成了播放功能,也就完成了一个媒体播放器,你可以使用自己设计的媒体播放器软件看电影和听音乐了。
闽公网安备 35060202000074号