目录
Java课程设计报告
1.设计内容及要求
2.需求分析
3.总体设计
4.主要功能设计流程
5.系统实现及测试
6.总结与说明
题目:java音乐播放器
姓 名
学 号
院 系
班 级
专 业
任课教师
能够实现简单的音乐播放器功能,如:打开本地文件,播放,暂停,停止,背景播放,单曲循环等等,界面充实,交互友好,可以添加多首歌曲目录
一个简单的基于java语言的音乐播放器,菜单栏:文件,播放 控制和播放列表,文件菜单包含打开、循环和退出三个菜单项;播放控制菜单包含播放、暂停和停止三个菜单项,播放列表菜单则是当向里面添加歌曲之后才能够查看到里面所包含的歌曲目录。当播放歌曲时,可以调节音量大小或者设置是否静音;可以查看当前播放音乐的相关属性,如:歌曲名,歌手,发布时间,所属专辑等等。
1.时间跟踪条:根据歌曲播放的进度,控制条自动进行追踪,用户可以随时了解歌曲的播放进度
2、音量控制键:可以点击该控键进行音量大小的调节以及是否静音的设置
3、属性查询键:通过该控键,用户可以查看当前播放音乐的相属性,获取关于该歌曲的用户所需的相关信息。
4、菜单栏:
①文件:
打开:用户通过该菜单项打开本地音乐文件,听任何用户想听的歌曲循环:通过循环设置,用户可以重复的播放一首喜欢的歌曲退出:退出音乐播放器,及退出该程序
②播放控制:
播放:选择歌曲之后,通过点击播放菜单项启动播放器播放音乐暂停:暂停当前正在播放的音乐停止:停止当前正在播放的音乐
③播放列表:当用户通过文件打开本地音乐文件后,及相当于在播放列表里面添加了歌曲,及形成相应的歌曲播放目录
结合需求分析来看,整个设计包含了简单的菜单栏,根据用户需求设置了三个简单的实现基本操作的菜单,分别是:文件,播放控制,播放列表;根据具体的操作每个菜单还包含了相应的菜单项,文件:打开,循环,退出;播放控制:播放,暂停,停止;播放列表则没有菜单项,该菜单就是用来显示或者查看相应的歌曲目录的。 该音乐播放器设置了两个窗口,运行程序时打开的初始化欢迎界面,用户可以根据自己的需求进行菜单栏里面的基本操作和相应的设置,当用户添加或者打开音乐播放文件的时候,程序将会显示出第二个音乐文件播放窗口,与此同时,第一个初始化窗口将会自动隐藏,在音乐播放窗口里面用户可以进行相关的音乐播放的控制操作。当用户进入音乐播放窗口时,该窗口有几个快捷控制的控键:时间追踪轴:可以实现播放的前进、后退功能,根据用户需求调节音乐的播放进度等;音量控制:设置静音,打开扬声器或者调节音量大小;播放列表:查看当前播放音乐的相关属性。
(一)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)初始化窗口
1代码实现
private void init() {
// TODO Auto-generated method stub
this.setLayout(new BorderLayout());
JPanel lrcPanel = new JPanel();
JPanel controP= new JPanel();
jta = new JTextArea(22,35);
jta.setBackground(Color.black);
jta.setLineWrap(true);
jta.setWrapStyleWord(true);
jta.setEditable(false);
lrcPanel.add(new JScrollPane(jta));
lrcPanel.setBackground(Color.black);
lrcPanel.setVisible(true);
JButton Jstart= new JButton("");
Jstart.setIcon(new ImageIcon("start.png"));
Jstart.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
start();
}
});
JButton Jpause=new JButton();
Jpause.setIcon(new ImageIcon("停止.png"));
Jpause.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
stop();
}
});
JButton Jnext =new JButton();
Jnext.setIcon(new ImageIcon("next.png"));
Jnext.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
next();
}
});
JButton Jprior =new JButton();
Jprior.setIcon(new ImageIcon("back.png"));
Jprior.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
back();
}
});
controP.setLayout(new FlowLayout());
controP.add(Jprior);
controP.add(Jstart);
controP.add(Jpause);
controP.add(Jnext);
this.add(lrcPanel,BorderLayout.CENTER);
this.add(controP,BorderLayout.SOUTH);
}
(3)音乐播放窗口机基本功能的实现
①界面
②代码实现
// 播放方法
public void start() { player =
if(isplaying==false){ Manager.createPlayer(new File(mp3List.get
try {
(mp3NO)).toURI().toURL()); BufferedReader(
jta.setText(null); new
} catch (NoPlayerException e) FileReader(lcf));
{ String s;
// TODO 自动生成 catch
块 while((s=bReader.readLine()) != null){
e.printStackTrace();
System.out.println("不能 jta.append(" "+s);
播放此文件!"); jta.append("\n");
return;
} catch (IOException e) { }
// TODO 自动生成 catch
块
e.printStackTrace(); } catch (Exception e) {
return; // TODO Auto-generated
} catch block
if (player == null) { jta.setText("没有歌词");
System.out.println("播放 System.out.println("没有
文件为空!"); 歌词文件!");
return;
} }
player.addControllerListener(this);
// 提取媒体内容 }
player.prefetch();
isplaying=true;//正在播放一首歌 private String getlrcFName() {//解析歌
setLrc(); 曲名;
} // TODO Auto-generated method stub
} String musicPath =
mp3List.get(mp3NO);
private void setLrc() { String s =musicPath.substring(11);
// TODO Auto-generated method System.out.println(s);
stub String []str = s.split("\\.");
File lrcfile = new File(lrcpath); String lrcFName=str[0] ;
if(!lrcfile.exists()){ System.out.println(lrcFName);
lrcfile.mkdir(); return lrcFName;
} }
String lrcFName = getlrcFName();
BufferedReader bReader; public void stop(){
File lcf= new player.stop();
File(lrcpath+lrcFName+".lrc"); isplaying=false;
System.out.println(lcf.getName()); }
try {
bReader = new public void next(){
if(isplaying==true) // 当提取媒体的内容结束
stop(); if (e instanceof
PrefetchCompleteEvent) {
if(mp3NO
mp3NO++; ");
start(); player.start();
} return;
else{ }
jta.setText("没有下一首了
(<_>"); // 当实例化后
} if (e instanceof
} RealizeCompleteEvent) {
public void back(){ System.out.println("实例化");
if(isplaying) // pack(); //执行pack()操作
stop(); return;
}
if(mp3NO>0){
mp3NO--; }
start(); public void setMp3List(){
} File file = new File(musicpath);
else if( !file.exists()){
jta.setText("已经是第一首歌 file.mkdir();
了(<_>)"); }
} File[] mcFiles ;
mcFiles = file.listFiles();
public void if(mcFiles!=null){
controllerUpdate(ControllerEvent e) { for(File f : mcFiles){
// 当媒体播放结束时,循环播放
if (e instanceof EndOfMediaEvent)
{ System.out.println(f.getPath());
isplaying=false;
mp3NO++; mp3List.add(f.getPath());
System.out.println(mp3NO); }
if (mp3NO < mp3List.size()) { }else
this.start(); System.out.println("MyMusic中没有歌
} 曲文件");
return;
} }
在做写程序实现功能的过程中,界面和基本功能的设计需要较强的逻
辑思维,一不小心就容易出错,在具体的功能设计和实现的过程中要尽可能
用最简单的语句实现基本的播放器功能。我觉得可以设计更多的菜单及菜单
项目从而实现更多的功能,如:删除,保存等,还可以实现更多的背景效果
或者更多可选择的皮肤,还可以对按钮添加音效效果,这样感觉整个音乐播
放器更具有灵活性,媒体感更强烈一些,界面会更加丰富和生动一些。
通过自己做课程设计,自己设计界面,功能和设计功能的代码实现,
将理论知识运用到实际操作中,加深了对理论知识的理解和记忆,在做程序
设计的过程中,对很多代码的多次操作和重复使用,使得对很多基本的代码
和相关的操作能够牢固的记忆。