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

news/2024/7/6 1:32:43

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

 

 

.设计内容及要求

 

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

 

一个简单的基于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; 

 

 

 

 

}

 

 

转载于:https://my.oschina.net/u/2822116/blog/791305


http://lihuaxi.xjx100.cn/news/242024.html

相关文章

UI设计培训教程分享:UI设计师的色彩使用技巧

作为一名合格的UI设计师,色彩的使用是非常重要的,一个专业的UI设计师对于UI设计色彩的搭配是非常的出色的,下面小编就为大家分享UI设计培训教程:UI设计师的色彩使用技巧 UI设计培训教程分享:UI设计师的色彩使用技巧 一…

powerdesigner类图在子类中显示从父类继承来的方法

首先确保画了子类和父类之间的继承线 然后在子类的选项卡中点击

女生参加web前端培训压力大吗

女生参加web前端培训压力大吗?这个问题很多人都是想知道的,因为对于互联网行业来说,大部分都是男性,尤其是技术岗位,女生做前端压力大小和能力也有很大的关系,前端技术好工作效率高,那么压力相对较低。 女…

Linux下用于查看系统当前登录用户信息的4种方法

作为系统管理员,你可能经常会(在某个时候)需要查看系统中有哪些用户正在活动。有些时候,你甚至需要知道他(她)们正在做什么。本文为我们总结了4种查看系统用户信息(通过编号(ID&…

Python培训教程分享:“高效实用” 的Python工具库

作为一名合格Python技术员,对于Python工具库的使用是少不了的,本期Python培训教程就为大家分享的是““高效实用” 的Python工具库”,希望能够帮助到大家。 Python培训教程分享:“高效实用” 的Python工具库: 1、Reque…

postfix+mysql 发件服务

1.配置mysql*实验之前,制作要使用数据库和表*添加数据库用户,并给其授权* vim /etc/postfix/mailuser.cf ##查询用户名1 host localhost ##数据库主机2 user postuser ##登录数据库用户3 password 123 ##登录密码4 dbname email ##p…

PL/SQL编程:将两个数进行交换的存储过程

创建过程exchangeTwo 调用过程enchangeTwo