文档章节

运用面向对象原则,设计一款音乐点唱机

一贱书生
 一贱书生
发布于 2016/11/21 10:46
字数 2032
阅读 284
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

 

 

.设计内容及要求

 

能够实现简单的音乐播放器功能,如:打开本地文件,播放,暂停,停止,背景播放,单曲循环等等,界面充实,交互友好,可以添加多首歌曲目录

 

一个简单的基于java语言的音乐播放器,菜单栏:文件,播放控制和播放列表,文件菜单包含打开、循环和退出三个菜单项;播放控制菜单包含播放、暂停和停止三个菜单项,播放列表菜单则是当向里面添加歌曲之后才能够查看到里面所包含的歌曲目录。当播放歌曲时,可以调节音量大小或者设置是否静音;可以查看当前播放音乐的相关属性,如:歌曲名,歌手,发布时间,所属专辑等等。

2.需求分析

1、时间跟踪条:根据歌曲播放的进度,控制条自动进行追踪,用户可以随时了解歌曲的播放进度

2、音量控制键:可以点击该控键进行音量大小的调节以及是否静音的设置

3、属性查询键:通过该控键,用户可以查看当前播放音乐的相属性,获取关于该歌曲的用户所需的相关信息。

4、菜单栏:

①文件:

打开:用户通过该菜单项打开本地音乐文件,听任何用户想听的歌曲

循环:通过循环设置,用户可以重复的播放一首喜欢的歌曲

退出:退出音乐播放器,及退出该程序

②播放控制:

播放:

选择歌曲之后,通过点击播放菜单项启动播放器播

放音乐

暂停:暂停当前正在播放的音乐

停止:停止当前正在播放的音乐

③播放列表:当用户通过文件打开本地音乐文件后,及相当于在

 

播放列表里面添加了歌曲,及形成相应的歌曲播放目录

3

.总体设计

 

结合需求分析来看,

整个设计包含了简单的菜单栏,根据用户需求设置了三个简单的实现基本操作的菜单,分别是:文件,播放控制,播放列表;根据具体的操作每个菜单还包含了相应的菜单项,文件:打开,循环,退出;播放控制:播放,暂停,停止;播放列表则没有菜单项,该菜单就是用来显示或者查看相应的歌曲目录的。该音乐播放器设置了两个窗口,运行程序时打开的初始化欢迎界面,用户可以根据自己的需求进行菜单栏里面的基本操作和相应的设置,当用户添加或者打开音乐播放文件的时候,程序将会显示出第二个音乐文件播放窗口,与此同时,第一个初始化窗口将会自动隐藏,在音乐播放窗口里面用户可以进行相关的音乐播放的控制操作。当用户进入音乐播放窗口时,该窗口有几个快捷控制的控键:时间追踪轴:可以实现播放的前进、后退功能,根据用户需求调节音乐的播放进度等;音量控制:设置静音,打开扬声器或者调节音量大小;播放列表:查看当前播放音乐的相关属性。

(一)

JMF(java媒体框架)简介

JMF 即Java媒体框架。其核心框架支持不同媒体,如音频输出和视频输出,包括时间的时钟同步。它是一个标准的扩展框架,允许用户制作纯音频流和视频流。JMF实际上是Java的一个类包。它包括了一个开放的媒体架构,可使开发人员灵活采用各种媒体回放、捕获组件,或采用他们自己的定制的内插组件。JMF软件是Java Media系列软件的一部分。采用各种Java Media API,软件开发商人员就能容易、快速地为他们已有的各种应用程序和客户端,Java小程序增添丰富的媒体功能,如流式视频、3D图像和影像处理等。就是说,各种Java Media API发挥了Java平台的固有优势,将"编写一次,到处运行"的能力扩展到了图像、影像和数字媒体等各种应用领域,从而大大缩减了开发时间和降低了开发成本。在开发JMF 应用程序之前要完全理解

JMF 的体系架构、接口和类。就拿我们的家用摄像机系统作个例子。首先用摄像机拍摄内容,拍摄下来的内容录制在DV带中。DV带可以放在放像机里播放、放像机提供视频信号给电视机,提供音频信号给音箱,这样我们就可以在电视机上看到画面,从音箱里听到声音。JMF API 提供的也是同样的模型。JMF 提供的模型可大致分为七类* 

数据源(

Data source

 

截取设备(

Capture Device

,包括视频和音频截取设备)

播放器(

Player

 

处理器(

Processor

 

数据池(

DataSink

 

数据格式(

Format

 

管理器(

Manager

   

 

 

如果只是想观看捕获的内容,只需要使用捕获数据源创建播放器

Player

即可。如果想把捕获的数据发送到网络或者保存起来,就需要创建

处理器

Processor

   

 

 

基本步骤是首先获取视频、音频捕获设备的信息,然后再根据取得的

设备信息确定设备的位置。

找到设备的位置以后

,

调用

ManageCreatePlayer

方法创建

Player

,当

Player

开始播放的时候,就开始了捕获的过程。

  

 

 

有多种方法获得捕获设备信息,可以通过查询指定的格式,也可以查

询特定的设备名字。

Player

准备好播放数据,当

Player

发出这个事件时,

就可以获取播放器的可视面板和控制面板了。具体步骤如下:

  

 

 

1. 

先把所有的捕获设备调出来

   

 

 

2. 

创建

Player,

Play

开始的时候,就开始了音频捕获的过程

  

 

 

3.

MediaLocator

为参数,创建

Player  

4. 

PLAYER

添加监听器,以便监听

RealizeComplete

事件

 

(二)代码实现

 

 

 

 

 

 

1

)添加库、包等相关文件

 

import javax.media.ControllerEvent; 

 

import javax.media.ControllerListener; 

 

import javax.media.EndOfMediaEvent; 

 

import javax.media.PrefetchCompleteEvent; 

 

import javax.media.RealizeCompleteEvent; 

 

import javax.media.*; 

 

import javax.swing.*; 

 

import java.awt.*; 

 

import java.awt.event.*; 

 

 

2

)初始化窗口

 

①界面

 

 

②代码实现

 

public void setupMenu() { 

 

 

 

 

Menu f = new Menu("

文件

"); 

 

 

 

 

MenuItem mi = new MenuItem("

打开

"); 

 

 

 

 

CheckboxMenuItem cbmi = new CheckboxMenuItem("

循环

", false); 

 

MenuItem ee = new MenuItem("

退出

"); 

 

f.add(mi); 

 

f.add(cbmi); 

 

f.add(ee); 

 

mi.addActionListener(this); 

 

cbmi.addActionListener(this); 

 

ee.addActionListener(this); 

 

f.addSeparator(); 

 

f.addSeparator(); 

 

f.addSeparator(); 

 

Menu l = new Menu("

播放列表

"); 

 

Menu c = new Menu("

播放控制

"); 

 

MenuItem move = new MenuItem("

播放

"); 

 

MenuItem pause = new MenuItem("

暂停

"); 

 

MenuItem stop = new MenuItem("

停止

"); 

 

move.addActionListener(this); 

 

pause.addActionListener(this); 

 

stop.addActionListener(this); 

 

c.add(move); 

 

c.add(pause); 

 

c.add(stop); 

 

c.addSeparator(); 

 

c.addSeparator(); 

 

c.addSeparator(); 

 

MenuBar mb = new MenuBar(); 

 

mb.add(f); 

 

mb.add(c); 

 

mb.add(l); 

 

setMenuBar(mb); 

 

 

 

3

)音乐播放窗口机基本功能的实现

 

 

public void actionPerformed(ActionEvent e) 

 

 

String cufile, selectfile, currentDirectory; 

 

if (e.getActionCommand().equals("

退出

")) 

 

 

 

 

dispose(); 

 

 

 

 

 

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.setVisible(true); 

 

if (fd.getFile() == null) 

 

 

 

return; 

 

 

 

selectfile = fd.getFile(); 

 

currentDirectory = fd.getDirectory(); 

 

 

 

cufile = currentDirectory + selectfile; 

 

MenuItem mi = new MenuItem(selectfile); 

 

mi.setActionCommand(cufile); 

 

MenuBar mb = getMenuBar(); 

 

Menu m = mb.getMenu(2); 

 

mi.addActionListener(this); 

 

m.add(mi); 

 

} else { 

 

cufile = e.getActionCommand(); 

 

selectfile = cufile; 

 

 

if (player != null) 

 

 

 

 

player.close(); 

 

try { 

 

player = Manager.createPlayer(new MediaLocator("file:" + cufile)); 

 

}catch (Exception e2) 

 

 

 

 

System.out.println(e2); 

 

return; 

 

 

if (player == null) 

 

System.out.println("

无法创建播放器

"); 

 

return; 

 

 

first = false; 

 

setTitle(selectfile); 

 

player.addControllerListener(this); 

 

player.prefetch(); 

 

 

public void itemStateChanged(ItemEvent arg0) 

 

 

 

public static void main(String[] args) 

 

new MediaPlayer("

播放器

"); 

 

 

public void controllerUpdate(ControllerEvent e) 

 

 

Container tainer = getContentPane(); 

 

if (e instanceof ControllerClosedEvent) 

 

 

if (vc != null) 

 

remove(vc); 

 

vc = null; 

 

 

if (cc != null) 

 

 

remove(cc); 

 

cc = null; 

 

 

 

if (e instanceof EndOfMediaEvent) 

 

 

player.setMediaTime(new Time(0)); 

 

if (loop) 

 

 

player.start(); 

 

return; 

 

 

if (e instanceof PrefetchCompleteEvent) 

 

 

player.start(); 

 

return; 

 

 

if (e instanceof RealizeCompleteEvent) 

 

 

 

 

vc = player.getVisualComponent(); 

 

if (vc != null) 

 

tainer.add(vc, BorderLayout.CENTER); 

 

cc = player.getControlPanelComponent();cc.setBackground(Color.blue); 

 

if (cc != null) 

 

 

 

 

tainer.add(cc, BorderLayout.SOUTH); 

 

if (vc != null) 

 

 

pack(); 

 

return; 

 

 

Else 

 

 

setSize(300, 75); 

 

setVisible(true); 

 

return; 

 

 

 

 

}

 

 

一贱书生
粉丝 20
博文 723
码字总数 600123
作品 0
私信 提问
加载中
请先登录后再评论。
实时分析系统--istatd

istatd是IMVU公司工程师开发的一款优秀的实时分析系统,能够有效地收集,存储和搜索各种分析指标,类似cacti,Graphite,Zabbix等系统。实际上,istatd修改了Graphite的存储后端,重新实现了...

匿名
2013/02/07
2.9K
1
Rails 测试工具--RailsBench

Railsbench是一款专门用于rails的测试工具。 1. 安装Railsbench # gem install railsbench # gem install gruff # gem install rmagick...

匿名
2013/02/17
351
0
Android3D应用与游戏开发框架--JQGL

JQGL 是一款针对Android设备上3D应用、游戏的开发框架。 核心功能是OpenGL-ES的使用框架,相对于大部分开发者而已,OpenGL是陌生的,没有专门研究无法进行相关的开发。 本框架针对于Android...

Jping
2013/02/21
1.6K
0
DNS服务器软件--BIND 10

BIND 10 是下一代的 Bind 。 Bind是一款开放源码的DNS服务器软件,Bind由美国加州大学Berkeley分校开发和维护的,全名为Berkeley Internet Name Domain它是目前世界上使用最为广泛的DNS服务器...

匿名
2013/02/22
3.7K
1
开源渲染器--LuxRender

LuxRender 是一款物理真实的、无偏差的开源渲染器。 LuxRender渲染是根据渲染方程来模拟光的传输,生成物理真实的图像。但LuxRender 只是一款渲染程序而不是3D建模程序,它需要其它3D程序来创...

匿名
2013/03/03
1W
0

没有更多内容

加载失败,请刷新页面

加载更多

开源FPGA单板iCESugar

随着产业的发展,近年来FPGA越来越得到市场的重视,5G、矿机、人工智能、图像识别、risc-v、通信等众多领域均可见到FPGA的身影,目前比较知名的FPGA厂商有xilinx、altera、lattice等,其中x...

whoisliang
6分钟前
0
0
合并记录帮助文档

合并记录步骤用于将两个不同来源的数据合并,这两个来源的数据分别为旧数据和新数据;该步骤将旧数据和新数据按照指定的关键字匹配、比较、合并,并显示差异信息。接下来就详细介绍一下该步骤...

osc_slnrw1du
6分钟前
0
0
Spark之RDD转换算子(transformation)大全

前面已经给大家讲过RDD原理,今天就给大家说说RDD的转换算子有哪些,以便大家理解。 对于转换操作,RDD的所有转换都不会直接计算结果,仅记录作用于RDD上的操作,当遇到动作算子(Action)时...

osc_3nr2bq5w
8分钟前
0
0
自定义常量数据帮助文档

自定义常量数据步骤主要用于增加自定义字段和行集数据到流中,可增加多个字段并为每个字段赋予行集的值。步骤配置信息如图1所示。 图1 自定义常量数据步骤配置信息 下文详细解释各控件的含义...

osc_r9wwwi0j
8分钟前
0
0
Linux安装配置ftp(Ceonts 7)

1、安装vsftpd yum -y install vsftpd (我这里已经安装好了,只要不报错即安装成功) 安装完成后可以在/etc/vsftpd目录下看到vsftpd.conf 文件,这是vsftp的配置文件。 2、 添加一个ftp用户...

osc_tko37abm
9分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部