import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;import javax.media.*;
import javax.swing.*;/**
 * 用java的JMF实现一个媒体播放器,可以播放音频和视频
 */public class JMFMediaPlayer  extends JFrame implements ActionListener,ControllerListener,ItemListener{ Player player;//JMF的播放器
//播放器控制的视频组件和控制组件
Component vedioComponent;
Component controlComponent;


boolean first=true;// 表示是否第一次打开播放器
 boolean loop=false;//标示是否需要循环
 String currentDirectory;//文件的当前目录
 
 //构造方法
 public JMFMediaPlayer(String title){
 super(title);
 addWindowListener(new WindowAdapter(){
 public void windowClosing(WindowEvent e){
 //用户打击窗口系统菜单的关闭按钮
 //调用dispose以执行windowClosed
 dispose();
 }
 public void windowClosed(WindowEvent e){
 if(player!=null){
 player.close();//关闭jmf播放器对象
 }
 System.exit(0);
 }
 });
 
 //创建播放器菜单
 JMenu fileMenu=new JMenu("文件");
 JMenuItem openMenuItem=new JMenuItem("打开");
 openMenuItem.addActionListener(this);
 fileMenu.add(openMenuItem);
 fileMenu.addSeparator();//添加分割条
 //创建一个复选框菜单项
 JCheckBoxMenuItem loopMenuItem=new JCheckBoxMenuItem("循环",false);
 loopMenuItem.addItemListener(this);
 fileMenu.add(loopMenuItem);
 JMenuItem exitMemuItem=new JMenuItem("退出");
 exitMemuItem.addActionListener(this);
 fileMenu.add(exitMemuItem);
 
 JMenuBar menuBar=new JMenuBar();
 menuBar.add(fileMenu);
 this.setJMenuBar(menuBar);
 this.setSize(200,200);
 
 try{
 //设置界面的外观,为系统外观
 UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
 SwingUtilities.updateComponentTreeUI(this);
 }catch(Exception e){
 e.printStackTrace();
 }
 this.setVisible(true);
 
     }
 
 
public static void main(String[] args) {

          new JMFMediaPlayer("JMF媒体播放器");
}
    //实现了ActionListener接口, 处理组件的活动事件
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("退出")){
//调用dispose以便执行windowClosed
  dispose();
  return;
}
FileDialog fileDialog=new FileDialog(this,"打开媒体文件",FileDialog.LOAD);
fileDialog.setDirectory(currentDirectory);
fileDialog.setVisible(true);
//如果用户放弃选择文件,则返回
if(fileDialog.getFile()==null){
return;
}
currentDirectory=fileDialog.getDirectory();
if(player!=null){
player.close();//关闭已经存在的jmf播放器对象
}
try{
//创建一个打开的选择文件的播放器
player=Manager.createPlayer(new MediaLocator("file:"+fileDialog.getDirectory()+fileDialog.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(fileDialog.getFile());
player.addControllerListener(this);//播放器的控制事件
player.prefetch();//预读文件内容

}
//实现controllerListener接口的方法,处理播放器的控制事件
public void controllerUpdate(ControllerEvent e) {
//调用player.close()时controllerCloseEvent事件出现,如果存在
//视觉组件,则该组件应该拆除
if(e instanceof ControllerClosedEvent){
if(vedioComponent !=null){
this.getContentPane().remove(vedioComponent);
this.controlComponent=null;
}
if(controlComponent !=null){
this.getContentPane().remove(controlComponent);
this.controlComponent=null;
}
return;
}

//如果是媒体文件到达尾部事件
if(e instanceof EndOfMediaEvent){
if(loop){
  //如果允许循环,则重新开始播放
player.setMediaTime(new Time(0));
player.start();

}
return;
}
//如果是播放器预读事件
if(e instanceof PrefetchCompleteEvent){
//启动播放器
player.start();
return;
}
//如果是文件打开完全事件,则显示视频组件和控制器组件
if(e instanceof RealizeCompleteEvent){
vedioComponent=player.getVisualComponent();
if(vedioComponent !=null){
this.getContentPane().add(vedioComponent);

}
controlComponent=player.getControlPanelComponent();
if(controlComponent !=null){
this.getContentPane().add(controlComponent,BorderLayout.SOUTH);

}
this.pack();
}
} public void itemStateChanged(ItemEvent e) {
loop=!loop;
}
}