1、/程序所用到多种程序包import java.awt.BorderLayout;import java.awt.CheckboxMenuItem;import java.awt.Color;import java.awt.Component;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
2、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.ControllerEven
3、t;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.RealizeCompl
4、eteEvent;import javax.media.Time;import javax.swing.JFrame;/本程序对应类;class MediaPlayerextends JFrameimplements ActionListener, ControllerListener, ItemListener /MediaPlayer类变量组员申明;/JMF提供播放器对象;Player player;Component vc, cc, gcc;GainControl gc;/first值用来控制在刚开始程序时显示一幅欢迎界面;loop用以标识是否循环播放;boolean first = t
5、rue, 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 (playe
6、r != null)player.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
7、CheckboxMenuItem(循环, false);cbmi.addItemListener(this);f.add(cbmi);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 = n
8、ew 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);/事件响应组员;捕捉发送到本对象多种
9、事件;public void actionPerformed(ActionEvent e) /设一个字符串用于暂存打开媒体文件路径;String cufile , selcectfile;if (e.getActionCommand().equals(退出) / 调用dispose方便实施windowClosed dispose();return;/次事件表明用户选择了播放菜单命令;/假如目前有一个文件能够播放则实施播放命令;if (e.getActionCommand().equals(播放) if (player != null) player.start();return;/假如目前正在
10、播放某一文件,则实施暂停;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
11、 = new FileDialog(this, 打开媒体文件, FileDialog.LOAD);fd.setDirectory(currentDirectory);fd.show();/ 假如用户放弃选择文件,则返回 if (fd.getFile() = null)return;/保留了所选文件名称及其全路径名称已被稍后使用/同时设置目前文件夹路径selcectfile = fd.getFile();currentDirectory = fd.getDirectory();cufile = currentDirectory + selcectfile;/将用户选择文件作为一个菜单项加入播放列
12、表该菜单项名为该文件名;/被点击后给出命令串是该文件全路径名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;/假如已存在一个播放器
13、,则先将其关闭,稍后重新创建/创建播放器时需要捕捉部分异常;if (player != null)player.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(无法创
14、建播放器.);return;first = false;setTitle(selcectfile);/设置处理播放控制器实际对象;player.addControllerListener(this);player.prefetch();/因为实现了ControllerListener接口,本方法用于处理媒体播放器传来事件;public void controllerUpdate(ControllerEvent e) Container tainer = getContentPane();/ 调用player.close()时ControllerClosedEvent事件出现。 / 假如存在视觉
15、部件,则该部件应该拆除(为一致起见, / 我们对控制面板部件也实施一样操作下一次需要时再结构)if (e instanceof ControllerClosedEvent) if (vc != null) remove(vc);vc = null;if (cc != null) remove(cc);cc = null;return;/在播放结束时,将播放指针置为文件之首,假如设定了循环播放,则再次开启播放器;if (e instanceof EndOfMediaEvent) player.setMediaTime(new Time(0);if (loop) player.start();re
16、turn;/PrefetchCompleteEvent事件发生后调用start,正式开启播放if (e instanceof PrefetchCompleteEvent) player.start();return;/本事件表示因为用于播放资源已经确定;此时要将媒体图形conmopnent/(假如有)显示出来,同时将播放器player控制器显示到窗口里;if (e instanceof RealizeCompleteEvent) /假如媒体中有图像,将对应图像component载入窗体;vc = player.getVisualComponent();if (vc != null)tainer
17、.add(vc, BorderLayout.CENTER);/将对应控制器component载入窗体;cc = player.getControlPanelComponent();cc.setBackground(Color.BLUE);if (cc != null)tainer.add(cc, BorderLayout.SOUTH);/有部分特殊媒体在播放时提供另外控制手段,将该控制器一并加入窗口;gc = player.getGainControl();gcc = gc.getControlComponent();if (gcc != null)tainer.add(gcc, Border
18、Layout.NORTH);/依据媒体文件中是否有图像,设定对应窗口大小if (vc != null) pack();return; else setSize(300, 75);setVisible(true);return;/菜单状态改变事件响应函数;public void itemStateChanged(ItemEvent e) loop = !loop;/不实施背景清除操作,以免控制面板部件闪烁 /同时使得本程序在用鼠标拖动窗口时存在部分没有立即重绘情况,有待改善public void update(Graphics g) paint(g);/本类main函数,其中结构了本类一个实例;
19、public static void main(String args) new MediaPlayer(简单媒体播放器);public void paint(Graphics g) / 调用超类Framepaint()方法,该paint()方法将调用Frame包含各个容器 / 和部件(包含控制面板部件)paint()方法。 super.paint(g);/以下代码实现了在开启程序之初显示欢迎界面if (first) int w = getSize().width;int h = getSize().height;g.setColor(Color.magenta);g.fillRect(0, 0, w, h);Font f = new Font(DialogInput, Font.BOLD, 18);g.setFont(f);FontMetrics fm = g.getFontMetrics();int swidth = fm.stringWidth( 简单媒体播放器 );g.setColor(Color.white);g.drawString( 简单媒体播放器 ,(w - swidth) / 2,(h + getInsets().top) / 2);