用Java结构本身的媒体播放器
当前位置:以往代写 > JAVA 教程 >用Java结构本身的媒体播放器
2019-06-14

用Java结构本身的媒体播放器

用Java结构本身的媒体播放器

副标题#e#

一、概述

首先我们来看看结构这个媒体播放器要到达什么样的方针,确定了方针也就确定了代码量和措施的庞洪水平。本文的媒体播放器要到达如下方针:

媒体播放器是一个菜单驱动的简朴AWT应用。

媒体播放器包括一个“文件”菜单,文件菜单包括三个菜单项:

“打开”,用来打开媒体文件。

“轮回”,是播放一次(默认),照旧反复播放。

“退出”,退出措施。

媒体播放器可以在多种平台上运行。

媒体播放器的焦点成果通过JMF(Java Media Framework)API实现。JMF扩展了J2SE平台的多媒体本领,答允Java应用和Applet截取、回放、转换包罗音频和视频在内的多种媒体。JMF支持多种媒体名目,详细请拜见Supported Media Formats and Capture Devices。

二、劈头设计

我们把这个媒体播放器的设计分成两个部门:GUI设计,伪代码设计。在GUI设计中,我们要相识组成措施的各个GUI部件。在伪代码设计中,我们用自然语言写出措施运行道理。

2.1 GUI设计

媒体播放器的用户界面包括一个主窗口、一个菜单和一个打开文件的对话框。首先我们来看看主窗口的设计。主窗口应该把窗口标题显示为“媒体播放器1.0”,显示“文件”菜单,显示彩色配景的“接待”信息。图一显示了措施刚启动时的主窗口。

用Java布局自己的媒体播放器

图一:媒体播放器的主窗口

“文件”菜单包括三个菜单项。“打开”菜单显示一个对话框,用来选择媒体文件的位置。“轮回”菜单抉择媒体文件只播放一次(默认)照旧重复播放(当菜单被选中)。最后,“退出”菜单封锁措施。别的,点击主窗口右上角的封锁按钮也可以封锁措施。请拜见图二。

用Java布局自己的媒体播放器

图二:“文件”菜单

点击“文件/打开”菜单时,“打开媒体文件”对话框呈现。选中媒体文件之后,点击“打开”按钮即可打开媒体文件;点击“打消”按钮中止文件打开操纵。如图三所示。

用Java布局自己的媒体播放器

图三:“打开媒体文件”对话框

除了上面提到的部件之外,媒体播放器还包括一个视觉部件、一个节制面板部件。视觉部件顺序播放媒体文件包括的各帧图像;节制面板部件答允用户暂停、开始媒体文件的回放,或举办其他节制操纵,譬喻查察媒体文件信息。


#p#副标题#e#

2.2 伪代码设计

前面我们相识了组成媒体播放器GUI的各个部件,下面要开始“设想”一下这个措施的详细结构。在正式编写代码之前,我们先用伪代码的形式写出这个措施的运行进程,今后正式编写代码时只需把伪代码翻译成Java代码即可。下面给出了媒体播放器的伪代码描写:

应用的类名称:MediaPlayer

超类:Frame

监听器分类:行动事件,节制器事件,菜单项事件,画图事件,窗口事件

main:

* 为MediaPlayer工具分派内存。挪用MediaPlayer结构函数,

建设主窗口(同时,隐含地建设/启动了AWT靠山线程)

* 竣事主措施线程。此时AWT线程继承运行。

MediaPlayer结构函数:

* 配置主窗口的标题

* 注册窗口监听器,以处理惩罚窗口封锁事件

* 建设“文件”菜单

* 建设“打开”菜单项

* 把MediaPlayer工具注册成为“打开”菜单项行动事件的监听器

* 把“打开”菜单项插手“文件”菜单。

* 在“文件”菜单中插手一条程度脱离线

* 建设带查抄框的“轮回”菜单项

* 把MediaPlayer工具注册成为“轮回”菜单项事件的监听器

* 把“轮回”菜单项插手“文件菜单”

* 在“文件”菜单中插手一条程度脱离线

* 凭据建设“打开”菜单项的进程,建设“退出”菜单项

* 建设一个菜单条(MenuBar)

* 把“文件”菜单插手到菜单条

* 把新建设的菜单条配置为主窗口的菜单条

* 把主窗口的巨细配置为200*200像素

* 显示主窗口

* 竣事结构函数

#p#副标题#e#

行动监听器:

当呈现行动时:

* 假如行动事件发源于“退出”菜单项,

* 触发一个给窗口监听器的窗口封锁事件

* 返回

* 建设一个“打开媒体文件”对话框

* 把对话框的当前目次配置为上次封锁时的目次

* 显示对话框。这个对话框是一个模式对话框

* 假如用户没有通过对话框选择媒体文件

* 返回

* 生存用户在对话框中选择的目次

* 假如以前已经建设JMF播放器工具

* 封锁该工具

* 按照指定的目次和名字,建设一个利用file:协议的媒体定位器(MediaLocator)工具,再操作该工具建设一个JMF播放器工具

* 假如呈现异常

* 显示错误信息,然后返回

* 把主窗口的标题配置为媒体文件的名字

* 把MediaPlayer工具注册为来自JMF播放器工具的节制器事件的监听器

* 让JMF播放器工具预先提取媒体内容

* 返回

#p#副标题#e#

节制器监听器:

当节制器被封锁:

* 假如JMF播放器的视觉部件存在,从MediaPlayer容器拆除视觉部件

* 假如JMF播放器的节制面板部件存在,从MediaPlayer容器拆除节制面板部件

* 返回

当媒体回放竣事:

* 假如“轮回”菜单被选中

* 复位JMF播放器工具的开始时间

* 让JMF播放器工具开始播放媒体

* 返回

当预提取媒体内容竣事:

* JMF播放器工具开始播放媒体

* 返回

当实例化(realize)完成:

* 获取JMF播放器工具的视觉部件

* 假如视觉部件存在,则把它插手到MediaPlayer容器的

中间

* 获取JMF播放器工具的节制面板部件

* 假如节制面板部件存在,则把它插手到MedaPlayer容器的南边

* 执行pack()操纵

* 返回

#p#副标题#e#

菜单项监听器:

当菜单项状态改变:

* 切换“轮回”菜单被选中的状态

* 返回

绘画事件监听器:

paint()要领:

* 假如尚未装入媒体文件

* 得到主窗口的宽度和高度

* 用蓝色填充窗口内的区域

* 建设一种字体(DialogInput/粗体),并将它配置为主

窗口的字体

* 计较接待信息的以像素计的宽度

* 把画图颜色改成白色

* 在主窗口的中央显示出接待信息

* 挪用Frame超类的paint()要领,确保节制面板部件正确地画出

* 返回

update()要领:

* 挪用paint()要领

* 返回

窗口监听器:

windowClosing:

* 挪用dispose以执行windowClosed

* 返回

windowClosed:

* 假如已经建设JMF播放器工具

* 封锁JMF播放器工具

* 竣事措施

#p#分页标题#e#

伪代码的前面三行声明白媒体播放器的类名称、超类的名称和MediaPlayer类实现的监听器。带有main:前缀的行暗示MediaPlayer的main()要领。雷同地,带有“结构函数:”前缀的行属于MediaPlayer的结构函数。伪代码的其余内容分成五个监听器分区:行动监听器,节制器监听器,菜单项监听器,画图监听器,窗口监听器。每一个分区别离包括一个或多个要领。

#p#副标题#e#

三、编写代码

下面我们把前面的伪代码转换成Java代码:

import javax.media.*;
import java.awt.*;
import java.awt.event.*;
class MediaPlayer extends Frame implements ActionListener,
ControllerListener, ItemListener
{
Player player;
Component vc, cc;
boolean first = true, loop = false;
String currentDirectory;
MediaPlayer (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 ();
System.exit (0);
}
});
Menu m = new Menu ("文件");
MenuItem mi = new MenuItem ("打开");
mi.addActionListener (this);
m.add (mi);
m.addSeparator ();
CheckboxMenuItem cbmi = new CheckboxMenuItem ("轮回", false);
cbmi.addItemListener (this);
m.add (cbmi);
m.addSeparator ();
mi = new MenuItem ("退出");
mi.addActionListener (this);
m.add (mi);
MenuBar mb = new MenuBar ();
mb.add (m);
setMenuBar (mb);
setSize (200, 200);
setVisible (true);
}
public void actionPerformed (ActionEvent e)
{
if (e.getActionCommand ().equals ("退出"))
{
// 挪用dispose以便执行windowClosed
dispose ();
return;
}
FileDialog fd = new FileDialog (this, "打开媒体文件",
FileDialog.LOAD);
fd.setDirectory (currentDirectory);
fd.show ();
// 假如用户放弃选择文件,则返回
if (fd.getFile () == null) return;
currentDirectory = fd.getDirectory ();
if (player != null)
player.close ();
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;
setTitle (fd.getFile ());
player.addControllerListener (this);
player.prefetch ();
}
public void controllerUpdate (ControllerEvent e)
{
// 挪用player.close()时ControllerClosedEvent事件呈现。
// 假如存在视觉部件,则该部件应该拆除(为一致起见,
// 我们对节制面板部件也执行同样的操纵)
if (e instanceof ControllerClosedEvent)
{
if (vc != null)
{
remove (vc);
vc = null;
}
if (cc != null)
{
remove (cc);
cc = 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)
{
vc = player.getVisualComponent ();
if (vc != null)
add (vc);
cc = player.getControlPanelComponent ();
if (cc != null)
add (cc, BorderLayout.SOUTH);
pack ();
}
}
public void itemStateChanged (ItemEvent e)
{
loop = !loop;
}
public void paint (Graphics g)
{
if (first)
{
int w = getSize ().width;
int h = getSize ().height;
g.setColor (Color.blue);
g.fillRect (0, 0, w, h);
Font f = new Font ("DialogInput", Font.BOLD, 16);
g.setFont (f);
FontMetrics fm = g.getFontMetrics ();
int swidth = fm.stringWidth ("*** 接待 ***");
g.setColor (Color.white);
g.drawString ("*** 接待 ***",
(w - swidth) / 2,
(h + getInsets ().top) / 2);
}
// 挪用超类Frame的paint()要领,该paint()要领将挪用Frame包括的各个容器
// 和部件(包罗节制面板部件)的paint()要领。
super.paint (g);
}
// 不执行配景排除操纵,以免节制面板部件闪烁
public void update (Graphics g)
{
paint (g);
}
public static void main (String [] args)
{
new MediaPlayer ("媒体播放器1.0");
}
}

#p#分页标题#e#

上述代码的详细寄义这里就不再阐明。实际上,代码中的注释表明白要害步调的浸染;别的,前面的伪代码也很是靠近这里的Java代码,可以看作对上述代码的具体表明。

#p#副标题#e#

四、编译和运行

假设前面的Java代码生存在MediaPlayer.java文件中,则编译呼吁如下:

javac MediaPlayer.java

编译乐成后,编译器生成两个.class文件:MediaPlayer.class,MediaPlayer$1.class。假如呈现编译错误,请查抄以下各项:

源代码输入是否正确无误。

CLASSPATH配置是否正确。CLASSPATH该当包括JMF的sound.jar、jmf.jar。

接下来就可以执行“java MediaPlayer”呼吁启动媒体播放器。图一显示了媒体播放器刚启动之后的界面,图四是正在播放媒体的界面。

用Java布局自己的媒体播放器

图四:用媒体播放器回放MPG影戏

    关键字:

在线提交作业