文档章节

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

一贱书生
 一贱书生
发布于 2016/11/21 10:46
字数 2032
阅读 53
收藏 0
点赞 0
评论 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
博文 723
码字总数 600072
作品 0
想要写出跟知名开源库一样的代码,首先你需要知道……

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

Michaelyn
2016/12/26
12
0
Java开发人员需知的十大面向对象设计原则

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

飓风2000
2014/06/21
0
0
MMN实用架构过程概览

MMN(Macro-Micro-Nano,即宏观-微观-纳米)实用架构过程初步体现了我的架构观:即以实用主义态度把握架构原则与本质思想,从系统的各个层次剖析架构,提供一个具有指导意义和实施价值的架构...

wayfarer
2011/03/23
0
0
10个不容错过的Java面向对象设计原则

面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton、Decorator、Observer这样的设计模式,而不重视面向...

牵着蜗牛去西藏
2015/07/16
139
2
Linux Deepin 12.06 Beta2 发布

首先感谢社区的爱好者和支持者对Linux Deepin的关注,经过一段时间的努力,Linux Deepin团队开发的音乐播放器和视频播放器在beta2版本中首次展现给大家。 我们在深度音乐播放器中放置了彩蛋,...

oschina
2012/06/06
1K
10
Android源码设计模式解析与实战(一)

结合Android源码和图片加载的例子,介绍设计模式的同时,在例子中实际运用,更易于读者对设计模式的理解和使用。 本篇博客结合书中图片加载的例子和自己对知识点的理解,侧重记录下设计模式的...

xingjm8511
2016/12/19
278
0
java设计模式概述以及6大原则

设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代...

Carbenson
2015/08/31
110
0
Java程序员应该了解的10个面向对象设计原则

摘要:Java编程最基本的原则就是要追求高内聚和低耦合的解决方案和代码模块设计。查看Apache和Sun的开放源代码能帮助你发现其他Java设计原则在这些代码中的实际运用。 面向对象设计原则是OOP...

ajson
2013/02/18
0
1
Java程序员应了解的10个面向对象设计原则

面向对象设计原则是 OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数 Java 程序员追逐像 Singleton、Decorator、Observer 这样的设计模式,而不重...

effort_fan
2012/04/09
0
0
【选择恐惧症】需不需要通用设计?

症前兆 经常会遇到这样的问题:一份需求下来,在做设计的时候就会开始纠结了:到底需不需要先抽象公共元素进行通用设计,再来进行功能的细化设计呢?还是直接根据需求为每个功能进行设计? ...

杰嗒嗒的阿杰
2017/06/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

回想过往,分析当下,着眼未来

好久没有真正的在纸质笔记本上写过东西了,感觉都快不会写字了,笔画都不知道怎么写了。接下来就说说咱们的正事。 2018年7月22日,我做了一个决定,那就是去参加安全培训(可能是我职业生涯中...

yeahlife
43分钟前
4
0
关于工作中的人际交往

关于工作中的人际交往 Intro 写了篇发泄情绪的博客,但不会发布出来。 大概就是,要么忍,要么滚。 以及一些不那么符合社会主义核心价值观,不满于大资本家与小资本家剥削的废话。

uniqptr
48分钟前
0
0
springMVC的流程

1.用户发送请求至前端控制器DispatcherServlet 2.DispatcherServlet收到请求调用HandlerMapping处理器映射器。 3.处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(...

JavaSon712
今天
0
0
大数据教程(3.2):Linux系统软件安装之自动化脚本

博主前面文章有介绍过软件的安装,可以帮助IT人员顺利的完成功能软件安装;但是,对于我们运维人员或者需要管理软件安装的项目经理来说,有些应用一次行需要搭建很多台相同的软件环境(如tom...

em_aaron
今天
0
1
Spring Boot 2.0.3 JDBC整合Oracle 12

整合步骤 1. Oracle驱动引入 Oracle驱动一般不能通过maven仓库直接下载得到,需自行下载并导入到项目的lib目录下,建议通过如下pom依赖引入下载的Oracle驱动 <!-- Oracle 驱动 -->...

OSC_fly
今天
0
0
java 8 并行流 - 1

下面创建一个并行流,与顺序流 //顺序流Stream.iterate(0L, i -> i + 1) .limit(Integer.MAX_VALUE) .reduce(0L, Long::sum);//并行流Stream.iterate(0L, i -> i......

Canaan_
今天
0
0
数据结构与算法5

二分法采用向下取整的方法 使用有序数组的好处是查找的速度比无序数组快的多,不好的方面是因为要将所有靠后的数据移开,所以速度较慢,有序数组和无序数组的删除操作都很慢。 有序数组在查找...

沉迷于编程的小菜菜
昨天
1
1
SpringBoot | 第十一章:Redis的集成和简单使用

前言 上几节讲了利用Mybatis-Plus这个第三方的ORM框架进行数据库访问,在实际工作中,在存储一些非结构化或者缓存一些临时数据及热点数据时,一般上都会用上mongodb和redis进行这方面的需求。...

oKong
昨天
5
0
对基于深度神经网络的Auto Encoder用于异常检测的一些思考

一、前言 现实中,大部分数据都是无标签的,人和动物多数情况下都是通过无监督学习获取概念,故而无监督学习拥有广阔的业务场景。举几个场景:网络流量是正常流量还是攻击流量、视频中的人的...

冷血狂魔
昨天
0
0
并发设计之A系统调用B系统

A-->B A在发送请求之前,用乐观锁,减少对B的重复调用,这样一定程度上是幂等性。 比如A系统支付功能,要调用B系统进行支付操作,但是前端对"支付"按钮不进行控制,即用户会不断多次点击支付...

汉斯-冯-拉特
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部