如何使用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<String> Lyricslist;LinkedList<String> Lyricslist=new LinkedList<String>();//歌曲歌手和歌词信息LinkedList<String> Lyrics=new LinkedList<String>();//歌词信息LinkedList<Integer> Lyricstime=new LinkedList<Integer>();//歌词时间信息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;LinkedList<music>mylist;//播放列表Vector<String> vt1=new Vector ();//创建范围Vector对象,用于点击播放列表的索引操作public MyExtendsJFrame(){audioPlay=new audioplay(); //创建播放对象mylist=new LinkedList<music>();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<longth;n++){int m=0;SimpleAttributeSet set1 ,set2;set1=new SimpleAttributeSet();set2=new SimpleAttributeSet();Document doc;doc=textLyrics.getDocument();StyleConstants.setForeground(set1, Color.pink);StyleConstants.setForeground(set2, Color.white);for(m=0;m<longth;m++) {if(ttt>=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<mylist.size();i++){if(mylist.get(i).name.equals(textarea.getText())){Index=i;break;}}if(Index==0){Index=end;}elseIndex=Index-1;audioPlay.SetPlayAudioPath("file:"+mylist.get(Index).name+".wav");//设置播放文件audioPlay.play();//开始播放music mc=mylist.get(Index);//String s=mc.name.substring(0,mc.name.lastIndexOf("."));textarea.setText(mc.name);//歌曲名更新textarea1.setText(mc.Lyricslist.get(0));//歌手更新//music mc1=mylist.get(0);File file=new File(mc.name+".wav"); int iMusicTime=(int)file.length()/1024/173;timerFun(iMusicTime,mc);//更新计时器buttonPlay.setVisible(false);}//下一首if(e.getSource()==buttonPlay1){int Index = 0;//System.out.println("mylist.size()"+mylist.size());//System.out.println("textarea.getText()"+textarea.getText());for(int i=0;i<mylist.size();i++){//System.out.println(mylist.get(i).name);if(mylist.get(i).name.equals(textarea.getText())){Index=i;//System.out.println("Index1"+Index);break;}}int end=mylist.size()-1;if(Index==end){Index=0;}elseIndex=Index+1;//System.out.println("Index2"+Index);audioPlay.SetPlayAudioPath("file:"+mylist.get(Index).name+".wav");//设置播放文件audioPlay.play();//开始播放music mc=mylist.get(Index);//System.out.println(mc.name);//String s1=mc.name.substring(0,mc.name.lastIndexOf("."));textarea.setText(mc.name);//歌曲名更新textarea1.setText(mc.Lyricslist.get(0));//歌手更新//textarea.setText(mc.name);//歌曲名更新//music mc1=mylist.get(0);File file=new File(mc.name+".wav"); int iMusicTime=(int)file.length()/1024/173;timerFun(iMusicTime,mc);//更新计时器buttonPlay.setVisible(false);}//如果是打开文件按钮点击事件if(e.getSource()==buttonPlay3){FileDialog openFile=new FileDialog(this,"打开文件");//创建打开文件对话框 openFile.setVisible(true);//对话框可见String playFileName=openFile.getFile();//获取打开的文件名包括后缀String playName=playFileName.substring(0, playFileName.lastIndexOf("."));//获得要播放的歌曲名String playFileDirectory1=openFile.getDirectory();//获取打开的文件路径String playFile=playFileDirectory1+playFileName;//完整的路径+文件名audioPlay.SetPlayAudioPath("file:"+playFile);//设置播放文件audioPlay.play();//开始播放 File file=new File(playFileName); int iMusicTime=(int)file.length()/1024/173;//music mc=new music(playName,timechange(iMusicTime));buttonPlay.setVisible(false);music mc=new music(playName,timechange(iMusicTime));mc.playFileDirectory=playFileDirectory1;mc.loadlyrics(mc.playFileDirectory, playName);mylist.addFirst(mc);textarea.setText(playName);//歌曲名更新textarea1.setText(mc.Lyricslist.get(0));//歌手更新int number0=mylist.size();timerFun(iMusicTime,mc);//更新计时器int number=mylist.size();//System.out.println(number);for(int i=0;i<number;i++){ music mc1=mylist.get(i);//System.out.println(mc1.name);if(playFileName.equals(mc1.name)){mylist.remove(i);break;}}Vector vt=new Vector (); //创建Vector对象,通过add方法添加多行Vector vt0=new Vector (); //创建Vector对象,用于鼠标点击后的歌曲播放for(int k=0;k<number0;k++){int j=k+1;vt.add(j+"、"+mylist.get(k).name+mylist.get(k).time);vt0.add(mylist.get(k).name);}vt1=vt0;listPlayFile.setListData(vt);}}public void mousePressed(MouseEvent e){}//按下鼠标public void mouseReleased(MouseEvent e){}//释放鼠标public void mouseEntered(MouseEvent e){}//鼠标进入public void mouseExited(MouseEvent e){}//鼠标离开public void mouseClicked(MouseEvent e){//点击鼠标 if (e.getClickCount() == 2) {//如果鼠标连续点击两次if(e.getSource()==listPlayFile){//如果事件源是播放列表,即在播放列表控件中双击,则执行。//添加双击播放列表中的代码,比如获取歌曲名,并且播放。int index=listPlayFile.getSelectedIndex();String str=vt1.get(index);//System.out.println(str);music mc=mylist.get(index);/*int iMusicTime=(int)file.length()/1024/173;//music mc=new music(playName,timechange(iMusicTime));music mc=new music(playName,timechange(iMusicTime));*///String s2=str.substring(0,str.lastIndexOf("."));textarea.setText(str);//歌曲名更新//textarea.setText(str);//歌曲名更新textarea1.setText(mc.Lyricslist.get(0));audioPlay.SetPlayAudioPath("file:"+str+".wav");//设置播放文件audioPlay.play();//开始播放int itime=mc.timetransform(mc.time);timerFun(itime,mc);} } }}//主函数
public class MusicPlay{
@SuppressWarnings("unchecked")//忽略警告public static void main(String[] args) { MyExtendsJFrame frame=new MyExtendsJFrame();//创建聊天程序窗口 }
}