//程序所用到的各种程序包import java.awt.BorderLayout;import java.awt.CheckboxMenuItem; import java.awt.Color;import ponent;import java.awt.Container;import java.awt.FileDialog;import java.awt.Font;import java.awt.FontMetrics;import java.awt.Graphics;import java.awt.Menu;import java.awt.MenuBar;import java.awt.MenuItem;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.ControllerClosedEvent;import javax.media.ControllerEvent;import javax.media.ControllerListener;import javax.media.EndOfMediaEvent;import javax.media.GainControl;import javax.media.Manager;import javax.media.MediaLocator;import javax.media.NoPlayerException;import javax.media.Player;import javax.media.PrefetchCompleteEvent;import javax.media.RealizeCompleteEvent;import javax.media.Time;import javax.swing.JFrame;//本程序对应的类;class MediaPlayerextends JFrameimplements ActionListener, ControllerListener, ItemListener { //MediaPlayer类的变量成员的声明;//JMF提供的播放器对象;Player player;Component vc, cc, gcc;GainControl gc;boolean first = true, loop = false;//设立一个字符串记录当前打开文件的路径String currentDirectory;MediaPlayer(String title {super(title;// 利用一个 adapter 实现对用户点击窗口系统菜单的关闭按钮 // 时的响应; addWindowListener(new WindowAdapter( {public void windowClosing(WindowEvent e {//调用 dispose 以执行 windowCloseddispose(;}public void windowClosed(WindowEvent e {if (player != nullplayer.close(;System.exit(0;}};//调用设置程序菜单栏的方法成员完成菜单的布置setupMenu(;setSize(400, 400;setVisible(true;}//本方法用以设置程序菜单栏public void setupMenu( {//设置一个菜单Menu f = new Menu("文件 ";//往设置的菜单种添加菜单项MenuItem mi = new MenuItem("打开 ";mi.addActionListener(this;f.add(mi;f.addSeparator(;CheckboxMenuItem cbmi = new CheckboxMenuItem("循环 ", false; cbmi.addItemListener(this;f.addSeparator(;mi = new MenuItem("退出 ";mi.addActionListener(this;f.add(mi;Menu l = new Menu("播放列表 ";Menu c = new Menu("播放控制 ";MenuItem move = new MenuItem("播放 "; move.addActionListener(this;c.add(move;c.addSeparator(;MenuItem pause = new MenuItem("暂停 "; pause.addActionListener(this;c.add(pause;c.addSeparator(;MenuItem stop = new MenuItem("停止 "; stop.addActionListener(this; c.add(stop;c.addSeparator(;//设置一个菜单栏MenuBar mb = new MenuBar(;//将设置的菜单依次加入程序的菜单栏中去 mb.add(f;mb.add(c;mb.add(l;//将构造完成的菜单栏交给当前程序的窗口; setMenuBar(mb;}//事件响应成员;捕捉发送到本对象的各种事件; public void actionPerformed(ActionEvent e {//设一个字符串用于暂存打开的媒体文件的路径; String cufile , selcectfile;// 调用 dispose 以便执行 windowCloseddispose(;return;}//次事件表明用户选择了 " 播放 " 菜单命令;//如果当前有一个文件可以播放则执行播放命令;if (e.getActionCommand(.equals("播放 " {if (player != null {player.start(;}return;}//如果当前正在播放某一文件,则执行暂停;if (e.getActionCommand(.equals("暂停 " {if (player != null {player.stop(;}return;}//次事件表明用户选择了 " 播放 " 菜单命令;//如果当前有一个文件可以播放则执行播放命令;if (e.getActionCommand(.equals("停止 " {if (player != null {player.stop(;player.setMediaTime(new Time(0;}return;}//用户选择要播放的媒体文件if (e.getActionCommand(.equals("打开 " {FileDialog fd = new FileDialog(this, " 打开媒体文件 ", FileDialog.LOAD; fd.setDirectory(currentDirectory;fd.show(;// 如果用户放弃选择文件,则返回if (fd.getFile( == nullreturn;//保存了所选文件的名称及其全路径名称已被稍后使用//同时设置当前文件夹路径selcectfile = fd.getFile(;currentDirectory = fd.getDirectory(;cufile = currentDirectory + selcectfile;//将用户选择的文件作为一个菜单项加入播放列表该菜单项 " 名为 " 该文件名; //被点击后给出的命令串是该文件的全路径名MenuItem mi = new MenuItem(selcectfile;mi.setActionCommand(cufile;MenuBar mb = getMenuBar(;Menu m = mb.getMenu(2;mi.addActionListener(this;m.add(mi;} else {//程序逻辑运行到此表示用户选择了一个 " 播放列表 " 中的媒体文件//此时可以通过如下动作获得该文件的全路径名;cufile = e.getActionCommand(;selcectfile = cufile;}//如果已存在一个播放器,则先将其关闭,稍后重新创建//创建播放器时需要捕捉一些异常;if (player != nullplayer.close(;try {player = Manager.createPlayer(new MediaLocator("file:" + cufile; } 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;setTitle(selcectfile;//设置处理播放控制器实际的对象; player.addControllerListener(this;player.prefetch(; } //因为实现了"ControllerListener"接口,本方法用于处理媒体播放器传来的事件; public void controllerUpdate(ControllerEvent e { Container tainer = getContentPane(; // // // if 调用 player.close(时 ControllerClosedEvent 事件出现。