Java图形用户界面设计音乐播放器

Java图形用户界面设计音乐播放器


设计思路


音乐播放器的基础是可以播放音乐,所以要有一个实现播放音乐功能的类audioplay,图形界面就是通过动作调用audioplay里面的函数。关于实现播放器图形界面的步骤是,先设计好软件界面,再去添加监听器,实现播放,暂停,上一首,下一首,循环播放,导入音乐,播放音乐等功能。我参考的是QQ音乐的软件界面,实现音乐播放的基本功能,并添加新功能。
实现界面:
在这里插入图片描述
实现步骤

- 设计一个完整的播放器界面,并添加按钮响应

播放器界面的背景用的是QQ音乐的背景

需要的控件有
在这里插入图片描述
为了方便设计,不断测试得到界面的参数
在这里插入图片描述
在init()函数中通过不断调整位置设计图形基本界面
在这里插入图片描述
添加按钮响应主要重写两个接口:

  • 第一个接口 actionPerform()即动作触发接口实现按钮相应的:
  1. 打开音乐文件
  2. 播放该音乐
  3. 点击播放音乐
  4. 是否显示音乐列表
  5. 播放下一首
  6. 播放上一首
  7. 设置播放方式(0->循环播放 1->顺序播放 2->随机播放)
  • 第二个接口是mouseClicked鼠标点击触发事件实现点击音乐播放列表两次播放音乐。
    文件框架采用音乐,图片分开放置。
    在这里插入图片描述
  • 实现歌词根据歌曲内容逐句提醒
    实现该功能的基本思路是扫描一遍歌词,如果当前时间是在该歌词的播放时间,则该歌词为当前歌词,设置当前歌词高亮。对于时间段的控制,我用一个数组存储断点时间。
    在这里插入图片描述
    Breaktime存储每句歌词的开始时间,结束时间为下一句歌词的开始时间-1,通过循环遍历整个歌词,并高亮加粗当前歌词。对于越界处理,即歌词太长,歌词框显示不完,我采用的是判断当前是否越界,越界多少行,前面多少行就不显示。
    在这里插入图片描述
  • 实现进度条根据歌曲播放时间移动
    由于我的软件界面大小和QQ音乐一个大小,所以我的进度条的图片采用的是QQ音乐播放完的进度条截屏。
    在这里插入图片描述
    在这里插入图片描述
    位置在起点为(0,height-77)宽度为width高度为3。需要根据音乐的时长和当前播放时间更新它的长度。
    在这里插入图片描述
    长度为已播放时间占总时间的比例乘以进度条长度。
  • 导入一个gif动画图片

模仿QQ音乐的方式,左边显示的是图片,所以gif我添加的是下面的波形效果,用GIF录制软件,录制了一段波形图,放在了进度条上面。
在这里插入图片描述
在这里插入图片描述
同样,左边的音乐播放图片是随机切换的。我在时间计数器里设置10s参数一个1-10的随机数,对应的是10张图片,选中一个图片更换原来图片。
在这里插入图片描述
在这里插入图片描述

  • 歌曲列表右侧添加歌曲时间的列
    导入音乐的时候,计算出播放的时间,并在时间列表添加该值。
    音乐播放时间的控件位置
    在这里插入图片描述
    导入歌曲的方式是将音乐歌曲名存放在
    在这里插入图片描述
    每次添加音乐时,会检查有没有该音乐,若没有则添加到列表,计算时间,有该音乐则不会添加。
    在这里插入图片描述
    时间的计算方式为
    在这里插入图片描述
  • 进度条附件添加一个当前播放时间的显示
    当前时间的控件,它是一个动态显示的控件,在时间计数器中需要更新它。
    在这里插入图片描述
    计算时间:分钟为秒数/60,秒钟为秒数%60.
    在这里插入图片描述
  • 双击列表播放该歌曲
    用JList存储歌曲并添加监听器
    当点击两次后,触发音乐列表动作
    首先,检查播放列表是否有音乐,vt为存放歌曲的向量,如果不为空则有歌曲,否则没有,如果选中了则设置播放路径为选中的路径,如果没有选中则选中第一个,然后再播放音乐。
    在这里插入图片描述
  1. 播放暂停
    当播放的时候按下暂停键会停止播放,图标会转换为播放键。
    在这里插入图片描述

  2. 播放方式
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

分别代表随机,循环,顺序播放
在这里插入图片描述

按下按键会转换图标,并切换播放方式。
在这里插入图片描述
当播放歌曲播放结束后,会根据播放方式标志flagway来决定播放方式。循环播放为重新播放该歌曲,顺序播放,获得该歌曲的位置后,通过循环队列获得下一个歌曲的歌名并播放。随机播放通过随机函数选中一个不同的音乐。
3. 歌曲上一首下一首功能
先获得当前播放歌曲的位置,通过循环队列的方式,获得上一个下一个歌曲的歌曲名,并播放。
在这里插入图片描述
源代码:


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.*;
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);
			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 MyExtendsJFrame extends JFrame implements ActionListener,MouseListener{
	//参数
	final int width = 1280;//界面宽度1280
	final int height = 836;//界面高度836
	final int tool_width = 42;//图标大小

	//工作成员
	audioplay audioPlay;//音乐播放器
	Timer nTimer;//定时器
	String MusicName;//音乐名
	String playFile;//文件路径
	String playFileName;//文件名
	String playFileDirectory;//文件的具体目录
	int MusicTime;//当前时间
	Vector vt = new Vector();//播放队列
	Vector vtime = new Vector();//时间队列
	int flagway = 0;//播放方式 0->循环播放 1->顺序播放 2->随机播放 

	//控件
	JLabel background;//背景
	JButton buttonPlay;//播放按钮
	JButton buttonOpenFile;//打开文件按钮
	JTextPane textLyrics;//歌词
	JLabel playTime;//进度条
	JList listPlayFile;//播放列表
	JButton buttonNext;//下一首
	JButton buttonPre;//上一首
	JLabel backgroundPlay;//播放图片
	JTextArea textMusic;//音乐名
	JList listPlayFileTime;//音乐播放时间
	JButton buttonShowList;//播放列表
	JTextArea musictitle;//歌曲名
	JButton buttonWay;//播放方式
	JTextArea TimeCount;//显示当前播放时间
	JLabel gifwave;//动态波形
	JLabel giflight;//动态荧光棒

	/*
		歌词
	*/

	//飘洋过海
	String[] sLyrics1 = {//{4,7,10,12,16,22,26,29,31,35,39,42,48,52}
		"记忆它总是慢慢的累积\n",//4
		"在我心中无法抹去\n",//7
		"为了你的承诺\n",	//10
		"我在最绝望的时候\n",//12
		"都忍着不哭泣\n",//16
		"陌生的城市啊\n",//22
		"熟悉的角落里\n",//26
		"也曾彼此安慰\n",//29
		"也曾相拥叹息\n",//31
		"不管将会面对什么样的结局\n",//35
		"在漫天风沙里望着你远去\n",//39
		"我竟悲伤得不能自己\n",//42
		"多盼能送君千里\n",//45
		"直到山穷水尽\n",//48
		"一生和你相依"//52
	};

	//山外小楼夜听雨
	String[] sLyrics2 = {
		"芙蓉花又栖满了枝头 \n",
		"亲何蝶雅留\n",
        "票白如江水向东流入\n" ,
        "望断门前隔岸的杨柳 \n",
        "寂寞仍不休\n",
        "我无言让眼泪长流\n",
        "我独酌山外小阁楼\n",
        "听一夜相思愁\n",
        "醉后让人烦忧心事雅收\n",
        "山外小阁楼我乘一叶小舟\n",
        "放思念随风漂流\n",
        "我独坐山外小阁楼\n" ,
        "窗外渔火如豆\n",
        "江畔晚风拂柳诉尽离愁\n",
        "当月色暖小楼是谁又在弹奏\n",
        "那一曲思念常留\n"
	};

	
	//我和我的祖国
	String[] sLyrics3 = {//{1,6,10,15,19,24,28,32,50,59}
		"我和我的祖国\n",
		"一刻也不能分割\n",
		"无论我走到哪里\n",
		"都流出一首赞歌\n",
		"我歌唱每一座高山\n",
		"我歌唱每一条河\n",
		"袅袅炊烟,小小村落\n",
		"路上一道辙\n",
		"你用你那母亲的脉搏和我诉说\n"
	};


	/*
		初始化界面
	*/
	public MyExtendsJFrame(){
		audioPlay=new audioplay();  //音乐播放对象
		setTitle("星星播放器");
		setBounds(160,100,1300,880);
		//setBounds(160,100,1300,880);
		setLayout(null);//排版方式
		init();   //初始化      
		setVisible(true);//设置界面可见
		setDefaultCloseOperation(EXIT_ON_CLOSE);//默认退出方式
	}
	void init(){//界面的初始化 		
		/*
			界面背景设置
		*/
		Icon img=new ImageIcon(".//Imag//background.jpg");//界面背景
		background = new JLabel(img);
		background.setBounds(0,0,width,height);//设置位置
		getLayeredPane().add(background, new Integer(Integer.MIN_VALUE));//设为最底层
		((JPanel)getContentPane()).setOpaque(false); //控件透明
		
		/*
			播放按钮设置
		*/
		buttonPlay=new JButton();//播放按钮
		buttonPlay.setBounds(width/2-tool_width/2,height-tool_width - 10,tool_width,tool_width); //设置位置
		Icon icon=new ImageIcon(".//Imag//play.jpg");//设置图标
		buttonPlay.setIcon(icon);	      
		buttonPlay.setBorderPainted(false);//消隐
		buttonPlay.addActionListener(this);//添加监听器
		add(buttonPlay);
		
		/*
			下一首按钮
		*/
		buttonNext = new JButton("");//下一首按钮
		buttonNext.setBounds(width/2-tool_width/2+47, height-tool_width - 10, tool_width, tool_width);
		icon = new ImageIcon(".//Imag//next.jpg");
		buttonNext.setIcon(icon);
		buttonNext.setBorderPainted(false);//消隐
		buttonNext.addActionListener(this);
		add(buttonNext);

		/*
			上一首按钮
		*/
		buttonPre = new JButton("");
		buttonPre.setBounds(width/2-tool_width/2-40, height-tool_width - 12, tool_width-3, tool_width-3);
		icon = new ImageIcon(".//Imag//pre.jpg");
		buttonPre.setIcon(icon);
		buttonPre.setBorderPainted(false);//消隐
		buttonPre.addActionListener(this);
		add(buttonPre);
		
		/*
			播放方式按钮
		*/
		buttonWay = new JButton("");
		buttonWay.setBounds(width/2-tool_width/2-90, height-tool_width - 10, tool_width-10, tool_width-10);
		icon = new ImageIcon(".//Imag//loop.jpg");
		buttonWay.setIcon(icon);
		buttonWay.setBorderPainted(false);//消隐
		buttonWay.addActionListener(this);
		add(buttonWay);

		/*
			文件打开按钮
		*/
		buttonOpenFile=new JButton("");//打开按钮
		buttonOpenFile.setBounds(width-95,height-50,tool_width-10,tool_width-10); //设置位置
		icon=new ImageIcon(".//Imag//open.jpg"); //图标
		buttonOpenFile.setIcon(icon);    
		buttonOpenFile.setBorderPainted(false);//消隐
		buttonOpenFile.addActionListener(this);//添加监听器
		add(buttonOpenFile);

		/*
			音乐播放背景
		*/
		icon = new ImageIcon(".//Imag//1.jpg");
		backgroundPlay = new JLabel(icon);
		backgroundPlay.setBounds(100, 120, 450, 450);
		getLayeredPane().add(backgroundPlay);
		//backgroundPlay.addMouseListener(this);//添加监听器
		
		/*
			动态的GIF波形
		*/
		
		icon = new ImageIcon(".//Imag//wave.gif");
		gifwave = new JLabel(icon);
		gifwave.setBounds(-10,height-133,width-20,50);	  	//设置大小
		add(gifwave);
		gifwave.setVisible(true);


		/*
			时间条
		*/

		icon=new ImageIcon(".//Imag//time.jpg");     //时间条
		playTime = new JLabel(icon);	  	
		playTime.setBounds(0,height-77,width,3);	  	//设置大小
		add(playTime);

		/*
            设置时间显示
         */
        TimeCount = new JTextArea("00:00");
        TimeCount.setBounds(width/2-350,height-45,80,20);
        TimeCount.setForeground(Color.white);
		TimeCount.setFont(new Font("楷体",1,20));
        TimeCount.setOpaque(false);
        add(TimeCount);//添加时间计数监听器
		
		/*
			音乐列表按钮
		*/
		buttonShowList = new JButton("");
		buttonShowList.setBounds(width-60,height-50,tool_width-10,tool_width-10);
		buttonShowList.setIcon(new ImageIcon(".//Imag//list.jpg"));
		buttonShowList.setBorderPainted(false);//消隐
		buttonShowList.addActionListener(this);
		add(buttonShowList);

		/*
			歌词
		*/
		textLyrics=new JTextPane();   //歌词
		textLyrics.setBounds(width/2+300,height/2-200,250,300);//设置位置
		textLyrics.setForeground(Color.white);//前置颜色
		textLyrics.setOpaque(false);
		add(textLyrics);   
		textLyrics.setText("这是歌词");//歌词内容
		textLyrics.setFont(new Font("楷体",1,20));
		
		/*
			歌名
		*/

		musictitle = new JTextArea("歌名");
		musictitle.setBounds(width/2+300,height/2-200-50,300,100);
		musictitle.setForeground(Color.white);
		musictitle.setOpaque(false);
		musictitle.setFont(new Font("楷体",1,30));
		add(musictitle);

		/*
			音乐列表
		*/

		listPlayFile=new JList();	  //音乐列表
		listPlayFile.setBounds(width-300,height-300,200,150); //设置位置
		listPlayFile.setOpaque(false);
		listPlayFile.setFont(new Font("楷体",1,20));
		listPlayFile.setBackground(new Color(0, 0, 0, 0));//设置背景
		listPlayFile.setForeground(Color.white);
		add(listPlayFile);    
		listPlayFile.addMouseListener(this);//添加监听器
		
		/*
			音乐播放时间
		*/
		listPlayFileTime = new JList();
        listPlayFileTime.setBounds(width-300+200,height-300,150,150);
        listPlayFileTime.setOpaque(false);
		listPlayFileTime.setFont(new Font("楷体",1,20));
        listPlayFileTime.setBackground(new Color(0, 0, 0, 0));
        listPlayFileTime.setForeground(Color.white);
        add(listPlayFileTime);
	}

	/*
        时间计数器
     */
    public void timerFun(int musicTime)
    {
        MusicTime = musicTime;//当前音乐播放需要的时间
        if (nTimer != null) {//计数器如果在走则停下来
            nTimer.cancel();
        }
		//重新创建一个时间对象
        nTimer = new Timer();
        nTimer.schedule(new TimerTask()//内部类
        {
            int PlayTime = 0;
            public void run()//时间走
            {
                PlayTime ++;//+1s
                if (PlayTime >= MusicTime) {//播放结束
                    nTimer.cancel();
					//int flagway = 0;//播放方式 0->循环播放 1->顺序播放 2->随机播放 
					if(flagway==0&&vt.size()!=0){//0->循环播放
						audioPlay.play();
						timerFun(MusicTime);
					}
					else if(flagway==1&&vt.size()!=0){//1->顺序播放
						int position = vt.lastIndexOf(playFileName);
						position = (position+1)%(vt.size());//通过取余获得下一个音乐的位置
						playFileName=(String)vt.get(position);
						playFile = playFileDirectory + playFileName;
						audioPlay.SetPlayAudioPath("file:" + playFile);//设置播放路径
						audioPlay.play();//播放下一首音乐
						File file = new File(playFile);
						int nMusicTime = (int)file.length() / 1024 / 173;//文件播放需要的时间
						timerFun(nMusicTime);
					}
					else if(flagway==2){
						int position = vt.lastIndexOf(playFileName);
						int choose = 0;
						do{//随机选中一个不同的音乐
							choose = (int)(Math.random() * vt.size());
						}while(position==choose);
						playFileName=(String)vt.get(choose);
						playFile = playFileDirectory + playFileName;
						audioPlay.SetPlayAudioPath("file:" + playFile);//设置播放路径
						audioPlay.play();//播放下一首音乐
						File file = new File(playFile);
						int nMusicTime = (int)file.length() / 1024 / 173;//文件播放需要的时间
						timerFun(nMusicTime);
					}
                }
				
				/*
					更换音乐播放图片(随机)
				*/
				final int N = 10;//10张背景图
				if(PlayTime%6==0){
					int choose = (int)(Math.random()*N)+1;
					Icon picture = new ImageIcon(".//Imag//"+choose+".jpg");
					backgroundPlay.setIcon(picture);
					System.out.println("选择图片"+choose);
				}

				/*
					显示当前播放时间
				*/
                int Second = PlayTime % 60;//秒
                int Minute = PlayTime / 60;//分钟

                String sSecond = "";//秒钟字符串
                String sMinute = "";//分钟字符串
                if (Second < 10) {//低于2位添加0
                    sSecond = "0" + Second;
                }
				else{
					sSecond = "" + Second;
				}
                if (Minute < 10) {//低于2位添加0
                    sMinute = "0" + Minute;
                }
				else{
					sMinute = "" + Minute;
				}
				String sPlayTime = sMinute + ":" + sSecond;
				System.out.println(sPlayTime);
                TimeCount.setText(sPlayTime);//更新当前播放时间
				playTime.setBounds(50,height-77, width * PlayTime / MusicTime , 3);

				/*
					歌词显示
				*/
				textLyrics.setText("");//歌词清空
				//确定是哪个台词
				//1->飘洋过海 2->山外小楼夜听雨 3->我和我的祖国
				int flag = 0;
				if(playFileName.equals("飘洋过海.wav")){
					flag = 1;
					System.out.println("播放飘洋过海歌词");
				}
				else if(playFileName.equals("山外小楼夜听雨.wav")){
					flag = 2;
					System.out.println("播放山外小楼夜听雨歌词");
				}
				else if(playFileName.equals("我和我的祖国.wav")){
					flag = 3;
					System.out.println("播放我和我的祖国歌词");
				}

				//逐行扫描歌曲,对应时间段的歌词高亮
				if(flag == 1){//飘洋过海
					int []breaktime = {1,5,8,11,13,17,23,27,30,32,36,40,43,45,49,53};
					final int MAX = 12;//最多显示12行
					//确定时间段
					int position = 0;
					for (int i = 0; i < sLyrics1.length; i++)
					{
						
						for(position = 0;position <sLyrics1.length-1 ;position++){
							if(PlayTime<breaktime[0]){
								break;
							}
							if(PlayTime>=breaktime[position]&&PlayTime<=breaktime[position+1]-1){
								break;
							}
						}
						System.out.println("当前播放位置"+position);
						SimpleAttributeSet attrSet = new SimpleAttributeSet();
						StyleConstants.setFontFamily(attrSet, "隶书");
						StyleConstants.setFontSize(attrSet,20);
						int over =  position-MAX;//越过的歌词
						System.out.println("越界"+over);
						try
						{
							Document doc = MyExtendsJFrame.this.textLyrics.getDocument();//获得歌词内容
							StyleConstants.setForeground(attrSet, Color.yellow);//当前歌词高亮
							StyleConstants.setBold(attrSet, true);//加粗
							if(PlayTime>=breaktime[i]&&PlayTime<=breaktime[i+1]-1){
								doc.insertString(doc.getLength(), sLyrics1[i], attrSet);//当前歌词高亮
								System.out.println(sLyrics1[i]);
							}
							else{//不在当前歌词普通显示
								StyleConstants.setForeground(attrSet, Color.white);
								StyleConstants.setBold(attrSet, false);
								if(over>=0&&i-over<=0){//越界
									continue;
								}
								doc.insertString(doc.getLength(), sLyrics1[i], attrSet);
							}
						}
						catch (BadLocationException localBadLocationException) {}
					}
				}
				else if(flag == 2){//山外小楼夜听雨
					//设置断点
					int []breaktime = {17,21,25,30,35,39,44,49,53,59,66,72,76,81,87,94,100};
					final int MAX = 12;//最多显示12行
					//确定时间段
					int position = 0;

					for (int i = 0; i < sLyrics2.length; i++)
					{
						
						for(position = 0;position <sLyrics2.length-1 ;position++){
							if(PlayTime<breaktime[0]){
								break;
							}
							if(PlayTime>=breaktime[position]&&PlayTime<=breaktime[position+1]-1){
								break;
							}
						}
						System.out.println("当前播放位置"+position);
						SimpleAttributeSet attrSet = new SimpleAttributeSet();
						StyleConstants.setFontFamily(attrSet, "隶书");
						StyleConstants.setFontSize(attrSet,20);
						int over =  position-MAX;//越过的歌词
						System.out.println("越界"+over);
						try
						{
							Document doc = MyExtendsJFrame.this.textLyrics.getDocument();//获得歌词内容
							StyleConstants.setForeground(attrSet, Color.yellow);//当前歌词高亮
							StyleConstants.setBold(attrSet, true);//加粗
							if(PlayTime>=breaktime[i]&&PlayTime<=breaktime[i+1]-1){
								doc.insertString(doc.getLength(), sLyrics2[i], attrSet);//当前歌词高亮
								System.out.println(sLyrics2[i]);
							}
							else{//不在当前歌词普通显示
								StyleConstants.setForeground(attrSet, Color.white);
								StyleConstants.setBold(attrSet, false);
								if(over>=0&&i-over<=0){//越界
									continue;
								}
								doc.insertString(doc.getLength(), sLyrics2[i], attrSet);
							}
						}
						catch (BadLocationException localBadLocationException) {}
					}
				}
				else if(flag == 3){//我和我的祖国
					int []breaktime = {1,6,10,15,19,24,28,32,50,59};
					final int MAX = 12;//最多显示12行
					//确定时间段
					int position = 0;
					for (int i = 0; i < sLyrics3.length; i++)
					{
						
						for(position = 0;position <sLyrics3.length-1 ;position++){
							if(PlayTime<breaktime[0]){
								break;
							}
							if(PlayTime>=breaktime[position]&&PlayTime<=breaktime[position+1]-1){
								break;
							}
						}
						System.out.println("当前播放位置"+position);
						SimpleAttributeSet attrSet = new SimpleAttributeSet();
						StyleConstants.setFontFamily(attrSet, "隶书");
						StyleConstants.setFontSize(attrSet,20);
						int over =  position-MAX;//越过的歌词
						System.out.println("越界"+over);
						try
						{
							Document doc = MyExtendsJFrame.this.textLyrics.getDocument();//获得歌词内容
							StyleConstants.setForeground(attrSet, Color.yellow);//当前歌词高亮
							StyleConstants.setBold(attrSet, true);//加粗
							if(PlayTime>=breaktime[i]&&PlayTime<=breaktime[i+1]-1){
								doc.insertString(doc.getLength(), sLyrics3[i], attrSet);//当前歌词高亮
								System.out.println(sLyrics3[i]);
							}
							else{//不在当前歌词普通显示
								StyleConstants.setForeground(attrSet, Color.white);
								StyleConstants.setBold(attrSet, false);
								if(over>=0&&i-over<=0){//越界
									continue;
								}
								doc.insertString(doc.getLength(), sLyrics3[i], attrSet);
							}
						}
						catch (BadLocationException localBadLocationException) {}
					}
				}

			}
		}, 0L, 1000L);
	}

	/*
		重写监听器
	*/
	@SuppressWarnings("unchecked")//忽略警告
	/*
		鼠标按下动作
	*/
	public void actionPerformed(ActionEvent e){	
		/*
			打开音乐文件
		*/
		if (e.getSource() == buttonOpenFile)
        {
            FileDialog openFile = new FileDialog(this, "音乐文件夹");//文件夹窗体
            openFile.setVisible(true);//设为可见
			if(openFile.getFile()!=null){//有选中的
				playFileName = openFile.getFile();//获得选中的文件名(我和我的祖国.wav)
			}
            else{//没有选中的,直接退出
				return;
			}
			System.out.println(playFileName);
			
            this.playFileDirectory = openFile.getDirectory();//文件的具体目录C:\Users\LittleStar\Desktop\音乐播发器\Music\
			System.out.println(playFileDirectory);
            playFile = playFileDirectory + playFileName;//目录+文件名=指定文件

            audioPlay.SetPlayAudioPath("file:" + playFile);//设置播放路径
            audioPlay.stop();//暂停当前播放
			
			//播放需要的时间
            File file = new File(playFile);
			int iMusicTime = (int)file.length() / 1024 / 173;
			int iSecond = iMusicTime % 60;
			int iMinute = iMusicTime / 60;

            if(!vt.contains(playFileName)){//如果该音乐不在目录
				vt.add(playFileName);
				System.out.println("添加音乐"+playFileName);
				listPlayFile.setListData(vt);//将播放列表更新	
				vtime.add(iMinute + ":" + iSecond);
				listPlayFileTime.setListData(vtime);
			}
            /*
				播放该音乐
			*/
            audioPlay.SetPlayAudioPath("file:" + this.playFile);
            audioPlay.play();
            musictitle.setText(this.playFileName);
            Icon icon = new ImageIcon(".//Imag//stop.jpg");//将按钮改为暂停
            buttonPlay.setIcon(icon);
            backgroundPlay.setVisible(true);
            int nMusicTime = (int)file.length() / 1024 / 173;//计算播放时间
            timerFun(nMusicTime);//启动时间			
        }

		/*
			点击播放音乐
		*/
		if (e.getSource() == buttonPlay) {
            if (!audioPlay.playFlag)//如果当前没有播放
            {
				if(vt.size()!=0){//播放播放队列不为空
					if(listPlayFile.getSelectedValue() != null){//如果列表音乐有选中的
						playFile = playFileDirectory + listPlayFile.getSelectedValue().toString();//设置播放音乐为选中的音乐
					}
					else{//没有选中的
						playFile = playFileDirectory + listPlayFile.getModel().getElementAt(0).toString();//选中第一首音乐
                        listPlayFile.setSelectedIndex(0);//第一首音乐选中
					}
					audioPlay.stop();//关闭之前的
					audioPlay.SetPlayAudioPath("file:" + playFile);//设置当前播放路径
                    audioPlay.play();//播放
					Icon icon = new ImageIcon(".//Imag//stop.jpg");
                    buttonPlay.setIcon(icon);
                    backgroundPlay.setVisible(true);
                    File file = new File(this.playFile);
                    int nMusicTime = (int)file.length() / 1024 / 173;
                    timerFun(nMusicTime);
				}
				else{//当前播放队列为空
					System.out.println("没有音乐可以播放");
				}
            }
            else//当前为音乐播放状态转为暂停
            {
                audioPlay.stop();
				nTimer.cancel();
                Icon icon = new ImageIcon(".//Imag//play.jpg");
                this.buttonPlay.setIcon(icon);
                this.backgroundPlay.setVisible(false);
                //this.nTimer.cancel();
            }
		}
		/*
			是否显示音乐列表
		*/
		if(e.getSource() == buttonShowList){
			System.out.println("是否显示音乐列表");
			if (listPlayFile.isVisible())
            {
				System.out.println("关闭音乐列表");
                listPlayFile.setVisible(false);
                listPlayFileTime.setVisible(false);
            }
            else
            {
				System.out.println("显示音乐列表");
                listPlayFile.setVisible(true);
                listPlayFileTime.setVisible(true);
            }
		}
		/*
			播放下一首
		*/
		if(e.getSource() == buttonNext){
			if(vt.size()!=0){
				//寻找当前播放的位置
				int position = vt.lastIndexOf(playFileName);
				//System.out.println("当前位置"+position+"当前音乐数量"+vt.size());
				position = (position+1)%(vt.size());//通过取余获得下一个音乐的位置
				//System.out.println("当前位置"+position+"当前音乐数量"+vt.size());
				//System.out.println(vt.get(position));
				playFileName=(String)vt.get(position);
				playFile = playFileDirectory + playFileName;
				musictitle.setText(playFileName);
				audioPlay.SetPlayAudioPath("file:" + playFile);//设置播放路径
                audioPlay.play();//播放下一首音乐
				File file = new File(playFile);
                int nMusicTime = (int)file.length() / 1024 / 173;//文件播放需要的时间
				timerFun(nMusicTime);
			}
			else{
				System.out.println("没有音乐可以播放");
			}
		}
		/*
			播放上一首
		*/
		if(e.getSource() == buttonPre){
			if(vt.size()!=0){
				//寻找当前播放的位置
				int position = vt.lastIndexOf(playFileName);
				position = (vt.size()+position-1)%(vt.size());//通过取余获得下一个音乐的位置
				System.out.println("当前位置"+position+"当前音乐数量"+vt.size());
				System.out.println(vt.get(position));
				playFileName=(String)vt.get(position);
				playFile = playFileDirectory + playFileName;
				musictitle.setText(playFileName);
				audioPlay.SetPlayAudioPath("file:" + playFile);//设置播放路径
                audioPlay.play();//播放下一首音乐
				File file = new File(playFile);
                int nMusicTime = (int)file.length() / 1024 / 173;//文件播放需要的时间
				timerFun(nMusicTime);
			}
			else{
				System.out.println("没有音乐可以播放");
			}
		}

		/*
			设置播放方式
		*/
		if(e.getSource()==buttonWay){
			//0->循环播放 1->顺序播放 2->随机播放 
			if(flagway==0){//循环播放切换到顺序播放
				flagway = 1;
				System.out.println("顺序播放");
				Icon icon = new ImageIcon(".//Imag//unloop.jpg");
                buttonWay.setIcon(icon);
			}
			else if(flagway == 1){//顺序播放切换到随机播放 
				flagway = 2;
				System.out.println("随机播放");
				Icon icon = new ImageIcon(".//Imag//rand.jpg");
                buttonWay.setIcon(icon);
			}
			else if(flagway == 2){//随机播放切换到循环播放 
				flagway = 0;
				System.out.println("循环播放");
				Icon icon = new ImageIcon(".//Imag//loop.jpg");
                buttonWay.setIcon(icon);
			}
		}
	}


	//鼠标点击触发事件
	public void  mouseClicked(MouseEvent e){
		if (e.getClickCount() == 2) {
			/*
				点击音乐播放列表两次
			*/
			if(e.getSource()==listPlayFile){
				int n =vt.size();//播放列表的音乐数
                if (n != 0)//如果有音乐
                {
                    if (listPlayFile.getSelectedValue() != null) {//选中了一个音乐
						playFileName = listPlayFile.getSelectedValue().toString();
                        playFile = playFileDirectory + playFileName;//播放文件设为选中的文件
                    } 
					else {//未选中则选中第一个
						playFileName = listPlayFile.getModel().getElementAt(0).toString();
                        playFile = playFileDirectory + playFileName;
                    }
                    
                    audioPlay.SetPlayAudioPath("file:" + playFile);//设置播放路径
                    audioPlay.play();//播放

                    musictitle.setText(listPlayFile.getSelectedValue().toString());//设置音乐名
                    Icon icon = new ImageIcon(".//Imag//stop.jpg");//播放按钮转换为暂停
                    buttonPlay.setIcon(icon);
                    backgroundPlay.setVisible(true);

                    File file = new File(playFile);
                    int nMusicTime = (int)file.length() / 1024 / 173;//文件播放需要的时间
                    timerFun(nMusicTime);
                }
			}
		}
	}
	
	//用不到的接口
	public void mousePressed(MouseEvent e){}
	public void mouseReleased(MouseEvent e){}
	public void mouseEntered(MouseEvent e){}
	public void  mouseExited(MouseEvent e){}
}
public class MusicPlay{
	public static void main(String[] args) {
		MyExtendsJFrame frame=new MyExtendsJFrame();
	}
}

仅供参考

源代码及文件

源代码

  • 27
    点赞
  • 170
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Who_Am_I.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值