如何使用Java进行音乐播放器的设计?
大三上老师的结课作业,由室友共同合作完成
可以设置背景(动态)、歌词(逐行高亮)、按照时间进行、上一首、下一首、暂停,选择歌曲等内容均以实现(背景图片和歌曲未放在博客上,大家可进行相应的修改),但因实力有限,略有瑕疵。欢迎大家留言讨论。
import java.applet.Applet;
import java.applet.AudioClip;
import java.net.MalformedURLException;
import java.net.URL;
import java.io.*;
import javax.swing.text.*;
import javax.swing.text.StyleContext.NamedStyle;
import javax.swing.*;
import static javax.swing.JFrame.*; //引入JFrame的静态常量
import java.awt.event.*;
import java.awt.*;
import java.net.*;
import java.util.*;
import java.util.Timer;
class audioplay{//播放音乐类
AudioClip adc;// 声音音频剪辑对象
URL url;
boolean adcFlag=false;
boolean playFlag=false;
void SetPlayAudioPath(String path){
try{
url = new URL(path);
// System.out.println(adc.toString());
if(adcFlag==true){adc.stop();playFlag=false;}
adc = Applet.newAudioClip(url);
adcFlag=true;
}
catch (MalformedURLException e1) {
e1.printStackTrace();
}
}
void play(){ //开始播放
adc.play();
playFlag=true;
}
void stop(){ //停止播放
adc.stop();
playFlag=false;
}
}
class music
{
//LinkedList Lyricslist;
LinkedList Lyricslist=new LinkedList();//歌曲歌手和歌词信息
LinkedList Lyrics=new LinkedList();//歌词信息
LinkedList Lyricstime=new LinkedList();//歌词时间信息
String name;//歌曲名称
String songer;//歌手
String time;//总时长
String playFileDirectory;//文件路径
//String[] Lyrics=new String[100];//歌词信息
//int[] Lyricstime=new int[((Lyricslist.size()-1)/3)*2];//歌词时间信息
music(String na,String ti)
{
this.name=na;
this.time=ti;
}
void loadlyrics(String path,String name) {
//参数分别为歌曲的路径和歌曲的名字
//导入歌手和歌词
int n=0;
String Lyricspath=path+name+".txt";//寻找歌词路径
File filename = new File(Lyricspath);
InputStreamReader reader = null;
try {
reader = new InputStreamReader(new FileInputStream(filename));
} catch (FileNotFoundException e1) {}
BufferedReader br = new BufferedReader(reader);
String line="";
String[] split= {"","",""};
try {
while ((line = br.readLine()) != null ) {
// 一次读入一行数据
if(n==0) {
Lyricslist.add(line);//歌手名
//System.out.println(Lyricslist.get(n));
n++;
}
else {
//Lyricslist.add(line);
//System.out.println(Lyricslist.get(n));
split=line.split(" ");
Lyricslist.add(split[0]);//每一行歌词开始时间
Lyricslist.add(split[1]);//每一行歌词结束时间
Lyricslist.add(split[2]);//每一行歌词
n++;
//System.out.println(Lyricslist.size());
}
}
} catch (IOException e1) {}
int x=0;
for(x=0;x<(Lyricslist.size()-1)/3;x++) {
//System.out.println(Lyricslist.get(x*3+1));
//System.out.println(Lyricslist.size());
Lyricstime.add(Integer.parseInt(Lyricslist.get(x*3+1)));
Lyricstime.add(Integer.parseInt(Lyricslist.get(x*3+2)));
//System.out.println(Lyricstime[x*2]+"+"+Lyricstime[x*2+1]);
Lyrics.add(Lyricslist.get(x*3+3)+"\n");
//System.out.println(Lyrics.get(x));
}//每句歌词及它的开始和结束时间
}
int timetransform(String s){//将歌曲时间转化为秒数
String []t= {"",""};
t=s.split(":");
return Integer.parseInt(t[0])+Integer.parseInt(t[1]);
}
}
class MyExtendsJFrame extends JFrame implements ActionListener,MouseListener
{ //窗口类
JLabel background;//背景控件
JLabel background1;//背景控件
JLabel background2;//背景控件
JLabel picture;//图片
JButton aaa;
JButton buttonPlay;//播放 按钮
JButton buttonStop;//停止播放
JButton buttonPlay1;//下一首 按钮
JButton buttonPlay2;//上一首 按钮
JButton buttonPlay3;//打开 按钮
JButton buttonPlay4;// 循环 按钮
JTextPane textLyrics;//歌词控件
JLabel playTime;//播放进度条控件
JList listPlayFile;//播放列表控件
Timer nTimer;//定时器对象
JTextArea textarea;//歌名控件
JTextArea runtime;//当前歌曲时间
JTextArea textarea1;//歌手名
JLabel gif;//动图
audioplay audioPlay;
LinkedListmylist;//播放列表
Vector vt1=new Vector ();//创建范围Vector对象,用于点击播放列表的索引操作
public MyExtendsJFrame()
{
audioPlay=new audioplay(); //创建播放对象
mylist=new LinkedList();
setTitle("播放器");//软件名
setBounds(100,100,800,537); //设置窗口大小
setLayout(null);//空布局
init(); //添加控件的操作封装成一个函数
setVisible(true);//放在添加组件后面执行
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
void init()
{//添加的控件
//设置背景图片
Icon img=new ImageIcon(".//backGround1.jpg"); //创建图标对象
background = new JLabel(img);//设置背景图片
background.setBounds(0,0,800,500);//设置背景控件大小
getLayeredPane().add(background, new Integer(Integer.MIN_VALUE));//背景图片控件置于最底层
((JPanel)getContentPane()).setOpaque(false); //控件透明
Icon img0=new ImageIcon(".//1.jpg"); //创建图标对象
background1 = new JLabel(img0);//设置背景图片
background1.setBounds(0,380,800,150);//设置背景控件大小
getLayeredPane().add(background1, new Integer(Integer.MIN_VALUE+1));//背景图片控件置于最底层
((JPanel)getContentPane()).setOpaque(false); //控件透明
Icon img3=new ImageIcon(".//time.jpg"); //创建图标对象
background2 = new JLabel(img3);//设置背景图片
background2.setBounds(220,450,300,3);//设置背景控件大小
getLayeredPane().add(background2, new Integer(Integer.MIN_VALUE+2));//背景图片控件置于最底层
((JPanel)getContentPane()).setOpaque(false); //控件透明
Icon img4=new ImageIcon(".//listen.jpeg"); //创建图标对象
picture = new JLabel(img4);//设置图片
picture.setBounds(0,405,80,80);//设置图片控件大小
getLayeredPane().add(picture, new Integer(Integer.MIN_VALUE+2));//图片控件置于最底层
((JPanel)getContentPane()).setOpaque(false); //控件透明
//设置动态图
Icon img1=new ImageIcon(".//y.gif"); //创建图标对象
gif = new JLabel(img1);//设置背景图片
gif.setBounds(230,72,240,240);//设置背景控件大小
//getLayeredPane().add(gif, new Integer(Integer.MIN_VALUE));//背景图片控件置于最底层
add(gif);
//当前歌曲播放时间 控件
runtime=new JTextArea("00 : 00");
runtime.setBounds(540,440,30,30);
runtime.setForeground(Color.white);//歌词控件字体颜色
runtime.setOpaque(false);
add(runtime);
//播放 控件button1.setVisible(true);
buttonPlay=new JButton();//添加 播放 按钮
buttonPlay.setBounds(350,400,38,38); //设置播放按钮大小
Icon icon=new ImageIcon(".//3.jpg");//创建播放图标对象
buttonPlay.setIcon(icon); //设置播放图标
buttonPlay.setBorderPainted(false);
buttonPlay.addActionListener(this);//添加单机关联事件
add(buttonPlay);//添加播放按钮至窗口中
//停止 控件
buttonStop=new JButton();//添加 播放 按钮
buttonStop.setBounds(350,400,38,38); //设置播放按钮大小
Icon iconstop=new ImageIcon(".//4.jpg");//创建播放图标对象
buttonStop.setIcon(iconstop); //设置播放图标
buttonStop.setBorderPainted(false);
buttonStop.addActionListener(this);//添加单机关联事件
add(buttonStop);//添加播放按钮至窗口中
//下一首 控件
buttonPlay1=new JButton();//添加 下一首 按钮
buttonPlay1.setBounds(390,400,38,38); //设置播放按钮大小
Icon icon1=new ImageIcon(".//5.jpg");//创建播放图标对象
buttonPlay1.setIcon(icon1); //设置播放图标
buttonPlay1.setBorderPainted(false);
buttonPlay1.addActionListener(this);
add(buttonPlay1);//添加播放按钮至窗口中
//上一首 控件
buttonPlay2=new JButton();//添加 上一首 按钮
buttonPlay2.setBounds(308,400,38,38); //设置播放按钮大小
Icon icon2=new ImageIcon(".//2.jpg");//创建播放图标对象
buttonPlay2.setIcon(icon2); //设置播放图标
buttonPlay2.setBorderPainted(false);
buttonPlay2.addActionListener(this);
add(buttonPlay2);//添加播放按钮至窗口中
//打开文件 按钮
buttonPlay3=new JButton();//添加 打开 按钮
buttonPlay3.setBounds(600,400,30,30); //设置播放按钮大小
Icon icon3=new ImageIcon(".//6.jpg");//创建播放图标对象
buttonPlay3.setIcon(icon3); //设置播放图标
buttonPlay3.setBorderPainted(false);
buttonPlay3.addActionListener(this);
add(buttonPlay3);//添加播放按钮至窗口中
//歌曲名 控件
textarea= new JTextArea("");
textarea.setBounds(100,405,100,25);
textarea.setForeground(Color.white);//歌词控件字体颜色
textarea.setOpaque(false);
add(textarea);
//歌手名
textarea1=new JTextArea("");
textarea1.setBounds(100,426,50,50);
textarea1.setForeground(Color.white);//歌词控件字体颜色
textarea1.setOpaque(false);
add(textarea1);
//播放列表 控件
listPlayFile=new JList(); //创建播放列表
listPlayFile.setBounds(500,100,150,150); //设置播放列表大小
listPlayFile.setOpaque(false);//设置播放列表透明
listPlayFile.setBackground(new Color(0, 0, 0, 0));//设置播放列表背景颜色
listPlayFile.setForeground(Color.white);//设置播放列表字体颜色
add(listPlayFile); //添加播放列表至窗口中
listPlayFile.addMouseListener(this);//添加播放列表的双击事件关联
//歌词 控件
textLyrics=new JTextPane(); //创建歌词控件
textLyrics.setBounds(20,20,200,500);//设置歌词控件大小
textLyrics.setForeground(Color.white);//歌词控件字体颜色
textLyrics.setOpaque(false);//歌词控件透明
add(textLyrics); //添加歌词控件至窗口中
textLyrics.setText("点击播放列表,选择歌曲进行播放 \n");//歌词控件添加文字
//进度条 控件
Icon img2=new ImageIcon(".//time.png"); //创建图标对象
playTime = new JLabel(img2); //创建播放进度条对象
playTime.setBounds(70,500,0,3); //设置播放进度条对象大小
//add(playTime); //添加播放进度条至窗口中
getLayeredPane().add(playTime, new Integer(Integer.MIN_VALUE+3));
}
//时间转换器
public String timechange(int second)
{
int min=second/60;
int sec=second-min*60;
String rt1=String.format("%02d",min);
String rt2=String.format("%02d",sec);
String rt=rt1+":"+rt2;
return rt;
}
//定时器函数
public void timerFun(int nPlayTime,music M)
{//定时器函数
if(nTimer!=null){nTimer.cancel();}//已经有定时器则关闭
nTimer = new Timer();//创建定时器
nTimer.schedule(new TimerTask(){ //匿名类
int ttt;
int eachPlayTime=710/nPlayTime;
int starttime=0;
int minute=0;
int second=0;
int longth=M.Lyrics.size();//歌词的行数
public void run() { //定时器函数体
playTime.setBounds(220, 450, (starttime+=eachPlayTime)/2, 3);
/*if(second==60)
{
minute=minute+1;
second=0;
}
String rt1=String.format("%02d",minute);
String rt2=String.format("%02d",second);
String rt=rt1+" : "+rt2;*/
String rt=timechange(second);
runtime.setText(rt);
second=second+1;
//
int n=0;
textLyrics.setText(""); //刷新歌词区
print:for(n=0;n=M.Lyricstime.get(m*2) && ttt<=M.Lyricstime.get(m*2+1) && n==m) {
try {
doc.insertString(doc.getLength(), M.Lyrics.get(m), set1);
continue print;
} catch (BadLocationException e) {}
}
}
try {
doc.insertString(doc.getLength(), M.Lyrics.get(n), set2);
} catch (BadLocationException e) {}
}
ttt++;
}
},0,1000);
}
public void timerStop()
{
if(nTimer!=null){nTimer.cancel();}
playTime.setBounds(0,324,0,3);
}
@SuppressWarnings("unchecked")//忽略警告
public void actionPerformed(ActionEvent e)
{
//如果是播放按钮点击事件
if(e.getSource()==buttonPlay){
if(mylist.size()!=0)
{
buttonPlay.setVisible(false);
audioPlay.SetPlayAudioPath("file:"+mylist.get(0).name);
audioPlay.play();
music mc=mylist.get(0);
File file=new File(mc.name+".wav");
//System.out.println(mc.playFileDirectory);
//mc.loadlyrics(mc.playFileDirectory, mc.name);
int iMusicTime=(int)file.length()/1024/173;
//System.out.println(iMusicTime);
audioPlay.SetPlayAudioPath("file:"+mylist.get(0).name+".wav");//设置播放文件
audioPlay.play();//开始播放
timerFun(iMusicTime,mc);//打开定时器,移动进度条
}
}
//暂停 事件
if(e.getSource()==buttonStop)
{
buttonPlay.setVisible(true);
audioPlay.stop();
timerStop();
}
//上一首
if(e.getSource()==buttonPlay2)
{
int Index=0;
int end=mylist.size()-1;
for(int i=0;i