五、媒体播放器功能实现
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)事件监听器,以检查该菜单项的状态是否发生了改变。
至此我们已经完成了播放功能,也就完成了一个媒体播放器,你可以使用自己设计的媒体播放器软件看电影和听音乐了。
|