文档章节

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

一贱书生
 一贱书生
发布于 2016/11/21 10:46
字数 2032
阅读 60
收藏 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; 

 

 

 

 

}

 

 

© 著作权归作者所有

共有 人打赏支持
一贱书生
粉丝 19
博文 724
码字总数 600123
作品 0
私信 提问
复古独立不跟随,猫王新品发布会现场

1977年8月20日,旅行者2号探测器带着记录着地球上各种声音的唱盘在肯尼迪航天中心成功发射升空。在相继拜访完木星,土星,天王星,海王星之后,开始驶离太阳系,飞向了遥远的群星。 而另一边...

量衡
2018/08/19
0
0
求职Ios软件工程师

职业概况 求职意向: IOS软件工程师 一年工作经验 项目经验: 项目名称:AngryBirds(Demo版) 项目描述: 射击、益智、休闲类游戏,在原版“愤怒的小鸟”上增加自定义增加关卡功能,用户可自定...

BobNee
2012/12/06
1K
1
Java开发人员需知的十大面向对象设计原则

面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序设计人员不重视面向对象的分析和设计。甚至还有经验丰富的Java程序员没...

飓风2000
2014/06/21
0
0
想要写出跟知名开源库一样的代码,首先你需要知道……

想要写出跟知名开源库一样的代码,首先你需要知道…… 原文 http://www.epubit.com.cn/article/626 在工作初期,我们可能会有这样的感觉,自己的代码接口设计混乱、代码耦合较为严重、一个类...

Michaelyn
2016/12/26
12
0
写了这么多年代码,你真的了解设计模式么?

昨天和同事聊到最近他要做的一个培训,大概的课程是这样的: 第一天: 上午:面向对象原则(OO+SOLID ) 下午:设计模式(Design Pattern) 第二天: 上午:简单设计(SimpleDesign) 下午:重...

ThoughtWorks中国
2018/09/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

多表查询

第1章 多表关系实战 1.1 实战1:省和市  方案1:多张表,一对多  方案2:一张表,自关联一对多 1.2 实战2:用户和角色 (比如演员和扮演人物)  多对多关系 1.3 实战3:角色和权限 (比如...

stars永恒
今天
7
0
求推广,德邦快递坑人!!!!

完全没想好怎么来吐槽自己这次苦逼的德邦物流过程了,只好来记一个流水账。 从寄快递开始: 2019年1月15日从 德邦物流 微信小app上下单,截图如下: 可笑的是什么,我预约的是17号上门收件,...

o0无忧亦无怖
昨天
7
0
Mac Vim配置

1.升级 vim   我自己 MacBook Pro 的系统还是 10.11 ,其自带的 vim 版本为 7.3 ,我们将其升至最新版: 使用 homebrew : brew install vim --with-lua --with-override-system-vim 这将下...

Pasenger
昨天
8
0
vmware安装Ubuntu上不了网?上网了安装不了net-tools,无法执行ifconfig?

1.重新设置网络适配器还是不行,如下指定nat 2.还需要指定共享网络,我是在无线环境下 3.无法执行ifconfig https://packages.ubuntu.com/bionic/net-tools到这个网站下载net-tools的deb文件...

noob_chr
昨天
6
0
解决SVN:E210007无法协商认证机制

svn:E210007 svn: Cannot negotiate authentication mechanism 执行下面代码即可 sudo yum install cyrus-sasl cyrus-sasl-plain cyrus-sasl-ldap...

临江仙卜算子
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部