分享

用Jbuilder9开发媒体播放器 | Java | 软件 | 天极Yesky

 元傲一 2006-09-14
五、媒体播放器功能实现

  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)事件监听器,以检查该菜单项的状态是否发生了改变。

  至此我们已经完成了播放功能,也就完成了一个媒体播放器,你可以使用自己设计的媒体播放器软件看电影和听音乐了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多