音乐播放器简易制作

本文详细介绍了一款简易音乐播放器的设计与实现过程,包括播放、暂停、上一曲、下一曲等功能,以及歌词同步显示和多种播放模式切换。文章提供了完整的Java代码示例,适合初学者学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

制作简易音乐播放器

显示效果:

 全部代码:

import java.applet.Applet;  
import java.applet.AudioClip; 
import java.net.MalformedURLException;  
import java.net.URL;  
import java.io.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.util.*;
import java.util.Timer;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
class music{  //定义歌曲结构体
	public String musicPath; //歌曲路径
	public String musicName; //歌曲名
	public int musicTime;  //歌曲时间
}
class MobileTool { //界面相应鼠标移动
	private Point OriginalPoint=null,MobileDistance=null;		//鼠标移动前的位置和鼠标移动的距离
	private boolean isDraging = false;		//用与判断鼠标书否松开
	public MobileTool(final Component frame){
		super();
		
		OriginalPoint=new Point();		//鼠标移动前的位置
		MobileDistance=new Point();		//鼠标移动的距离	
		/*确保取消标题栏以后,窗口仍然能接受鼠标点击事件*/
		frame.addMouseListener(new MouseAdapter() {		
			public void mousePressed(MouseEvent e) { //按下鼠标时触发的动作
				isDraging = true;
			    OriginalPoint.x = e.getX();		//获取鼠标移动前的位置
			    OriginalPoint.y = e.getY();
			   }
			public void mouseReleased(MouseEvent e) {		//松开鼠标触发的事件
			    isDraging = false;
			   }
			  });
		frame.addMouseMotionListener(new MouseMotionAdapter() {		//鼠标移动时的动作
			public void mouseDragged(MouseEvent e) {
			    if (isDraging) {
			    	MobileDistance= frame.getLocation();		//获取鼠标移动距离
			    	/*重新绘制位置*/
			    	frame.setLocation(MobileDistance.x + e.getX() - OriginalPoint.x, MobileDistance.y + e.getY() - OriginalPoint.y);
			    	} 
			    }
			});
		}
}

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 MyExtendsJFrame extends JFrame implements ActionListener,MouseListener{
	 private static final long serialVersionUID = 1L;
	 private static final int Font_PLAIN = 0;
	 private static final String regex="\\[\\d{2}:\\d{2}\\.\\d{2}\\]"; 
	 private static final String regex1="\\[\\d{2}:\\d{2}\\.\\d{2}\\]";
	 //窗口类 
	 LinkedList<music> Music=new LinkedList<music>();//创建歌曲结构体为对象的链表
	 audioplay audioPlay=new audioplay();  //创建播放对象
	 String playName,playDirectory,playPath,lyricsPath; //文件名,文件路径,音乐文件本身,单词文件本身
	 int TIME;  //歌曲时间备用
	 int schemaflag=0;  //歌曲播放模式(1单曲循环,0列表循环,2随机播放)
	 music m;  //备用歌曲对象
	 JLabel background;//背景控件
	 JLabel cartoon;//播放动画
	 JButton buttonPlay,buttonStop,buttonPrev,buttonNext;
	 JButton buttonloop;  //点击后循环播放
	 JButton buttonunloop;  //点击后随机播放
	 JButton buttonrandom;  //点击后列表循环
	 JButton buttonlist;  //点击后循环播放
	 JButton buttonOpen,buttonList1,buttonList2,buttonexit,buttonmin;
	 JTextPane textLyrics1,textLyrics2,textLyrics3;//歌词控件
	 JTextPane time;
	 JLabel playTime;//播放进度条控件
	 JList listPlayFile;//播放列表控件
	 Timer nTimer;//定时器对象
	 Vector  vt=new Vector (); //创建Vector对象,通过add方法添加多行
	 String lyc[]=new String[100]; //存放歌词信息
	 int time0[]=new int[100];  //存放歌词对应的时间
	 String time1[]=new String[100];
	public MyExtendsJFrame(){
		setBounds(321,121,1277,795);	//设置窗口大小		
		setLayout(null);//空布局			
		init();   //添加控件的操作封装成一个函数         
		setVisible(true);//放在添加组件后面执行
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		dispose();  //去掉标题栏
		setUndecorated(true);
		setVisible(true);
	}
	public void play_init(String x,String y){
		audioPlay.SetPlayAudioPath("file:"+y);//设置播放文件
		audioPlay.play();//开始播放
		timerFun();
		remove(textLyrics1);
		remove(textLyrics2);
		remove(textLyrics3);
		m=new music(); //创建歌曲对象
		int j=y.indexOf(".");
		StringBuilder term=new StringBuilder(y);
		term.replace(j+1,j+4,"txt");
		lyricsPath=new String(term);
		String lyric1="";  //存放歌词的字符串形式
		String t="";  //用来保存字符串
		try {
			File filename=new File(lyricsPath);
			InputStreamReader reader=new InputStreamReader(new FileInputStream(filename));//建立输入流对象
			BufferedReader buff=new BufferedReader(reader);
			while((t=buff.readLine())!=null){
				lyric1=lyric1+t+buff.readLine();
			}
			buff.close();
		}catch(Exception e1){
			e1.printStackTrace();
		}
  		String lyric=lyric1.substring(10);   //方便计算
		lyc=lyric.split(regex);
		//歌词取为歌词数组
		String text=new String();
		for(int i=0;i<lyc.length;i++){
			lyc[i]=lyc[i]+"\n";
			text+=lyc[i];
		}
		//获取对应的时间
		Pattern p=Pattern.compile(regex1);
		Matcher m0=p.matcher(lyric1);
		int a=0;
		while(m0.find()){
			time1[a]=m0.group();
			a++;
		}
		for (int i=0;i<time0.length;i++){
			time0[i]=0;
		}
		try{
			int i;
			for (i=0;i<time1.length;i++){
        		if(time1[i]!=""){
        			String a1=time1[i].substring(1, 3);
	        		if(a1.equals("00")){
	        			time0[i]=Integer.parseInt(time1[i].substring(4,6));
	        		}
	        		else{
	        			time0[i]=60+Integer.parseInt(time1[i].substring(4,6));
	        		}
        		}
			}
    	}catch(Exception e1){
    		e1.printStackTrace();
    	}
		m.musicPath=y;
		m.musicName=x;
		TIME=(int)(new File(y)).length()/1024/173;
		m.musicTime=TIME;
		listPlayFile.setListData(vt);//把Vector对象添加到播放列表控件中
		textLyrics1=new JTextPane();
		textLyrics1.setBounds(1020,100,250,250);
		textLyrics1.setForeground(Color.red);
		Font f=new Font("隶书",Font_PLAIN,20);
		textLyrics1.setFont(f);
		textLyrics1.setOpaque(false);
		add(textLyrics1);
		textLyrics2=new JTextPane();
		textLyrics2.setBounds(1010,350,250,36);
		textLyrics2.setForeground(Color.BLUE);
		f=new Font("隶书",Font_PLAIN,22);
		textLyrics2.setFont(f);
		textLyrics2.setOpaque(false);
		add(textLyrics2);
		textLyrics3=new JTextPane();  
		textLyrics3.setBounds(1020,390,250,258);
		textLyrics3.setForeground(Color.red);
		f=new Font("隶书",Font.PLAIN,20);
		textLyrics3.setFont(f);
		textLyrics3.setOpaque(false);
		add(textLyrics3);
		textLyrics3.setText(text);
		remove(buttonPlay);
		buttonStop=new JButton();
		buttonStop.setBorderPainted(false);
		buttonStop.setBounds(90,687,43,44); 
		Icon icon=new ImageIcon(".//Stop.jpg");
		buttonStop.setIcon(icon);
		add(buttonStop);
		buttonStop.addActionListener(this);
		validate();
		repaint();
	}
	public void actionPerformed(ActionEvent e){   //按钮事件
		if(e.getSource()==buttonPlay){//播放按钮事件
			audioPlay.SetPlayAudioPath(playPath);//设置播放文件
			audioPlay.play();//开始播放
			timerFun();
			remove(buttonPlay);
			buttonStop=new JButton();
			buttonStop.setBorderPainted(false);
			buttonStop.setBounds(90,687,43,44); 
			Icon icon=new ImageIcon(".//Stop.jpg");
			buttonStop.setIcon(icon);
			add(buttonStop);
			buttonStop.addActionListener(this);
			validate(); //减轻延迟效果
			repaint();
		}
		else if(e.getSource()==buttonStop){//停止按钮事件
			audioPlay.stop();//停止播放
			nTimer.cancel();
			remove(buttonStop);
			buttonPlay=new JButton();
		    buttonPlay.setBorderPainted(false);
			buttonPlay.setBounds(90,687,43,45); 
		    Icon icon=new ImageIcon(".//Play.jpg");
		    buttonPlay.setIcon(icon);
		    add(buttonPlay);
		    buttonPlay.addActionListener(this);
		    validate();
		    repaint();
		}
		else if(e.getSource()==buttonOpen){//打开文件按钮事件
			if(nTimer!=null){nTimer.cancel();}
			FileDialog openFile=new FileDialog(this,"打开文件");
			openFile.setVisible(true);
			playName=openFile.getFile();
			playDirectory=openFile.getDirectory();
			playPath=playDirectory+playName;
			play_init(playName,playPath);
			Music.add(m);
			vt.add(m.musicName+" 1:"+(m.musicTime-60));
		}
		else if(e.getSource()==buttonlist){//循环按钮事件
			schemaflag=1;
			remove(buttonlist);
			buttonloop=new JButton();
		    buttonloop.setBorderPainted(false);
		    buttonloop.setBounds(1070,699,30,26);
		    Icon icon=new ImageIcon(".//loop.jpg");
		    buttonloop.setIcon(icon);
		    add(buttonloop);
		    buttonloop.addActionListener(this);
		    validate();
		    repaint();
		}
		else if(e.getSource()==buttonloop){//随机播放事件
			schemaflag=2;
			remove(buttonloop);
			buttonrandom=new JButton();
		    buttonrandom.setBorderPainted(false);
		    buttonrandom.setBounds(1070,699,30,26);
		    Icon icon=new ImageIcon(".//random.jpg");
		    buttonrandom.setIcon(icon);
		    add(buttonrandom);
		    buttonrandom.addActionListener(this);
		    validate();
		    repaint();
		}
		else if(e.getSource()==buttonrandom){//列表播放事件
			schemaflag=0;
			remove(buttonrandom);
			buttonlist=new JButton();
		    buttonlist.setBorderPainted(false);
		    buttonlist.setBounds(1070,699,30,26);
		    Icon icon=new ImageIcon(".//listplay.jpg");
		    buttonlist.setIcon(icon);
		    add(buttonlist);
		    buttonlist.addActionListener(this);
		    validate();
		    repaint();
		}
		else if(e.getSource()==buttonPrev){//上一首按钮事件
			int s=0;
			for (int i=Music.size()-1;i>=0;i--){
				if(Music.get(i).musicName.equals(playName)&&i==0){
					break;
				}
				else if(Music.get(i).musicName.equals(playName)){
					s=i-1;
					break;
				}
			}
			nTimer.cancel();
			playPath=Music.get(s).musicPath;
			playName=Music.get(s).musicName;
			play_init(playName,playPath);
		}
		else if(e.getSource()==buttonNext){//下一首按钮事件
			int s=0;
			for (int i=Music.size()-1;i>=0;i--){
				if(Music.get(i).musicName.equals(playName)&&i==Music.size()-1){
					s=i;
					break;
				}
				else if(Music.get(i).musicName.equals(playName)){
					s=i+1;
					break;
				}
			}
			nTimer.cancel();
			playPath=Music.get(s).musicPath;
			playName=Music.get(s).musicName;
			play_init(playName,playPath);
		}
		else if(e.getSource()==buttonList1){//显示歌曲列表事件
			remove(buttonList1);
			listPlayFile.setVisible(true);
			buttonList2=new JButton();
		    buttonList2.setBorderPainted(false);
		    buttonList2.setBounds(1180,696,30,30);
		    Icon icon=new ImageIcon(".//list1.jpg");
		    buttonList2.setIcon(icon);
		    add(buttonList2);
		    buttonList2.addActionListener(this);
			validate();
			repaint();
		}
		else if(e.getSource()==buttonList2){
			remove(buttonList2);
			listPlayFile.setVisible(false);
			buttonList1=new JButton();
		    buttonList1.setBorderPainted(false);
		    buttonList1.setBounds(1180,696,30,30);
		    Icon icon=new ImageIcon(".//list1.jpg");
		    buttonList1.setIcon(icon);
		    add(buttonList1);
		    buttonList1.addActionListener(this);
		    validate();
		    repaint();
		}
	}
	
	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){}
	
	void init(){//添加的控件	  		
		Icon img=new ImageIcon(".//background.jpg");     //创建图标对象			
		background = new JLabel(img);//设置背景图片
		background.setBounds(0,0,1280,800);//设置背景控件大小
	    getLayeredPane().add(background, new Integer(Integer.MIN_VALUE));//背景图片控件置于最底层
		((JPanel)getContentPane()).setOpaque(false); //控件透明
		
		img=new ImageIcon(".//timg.gif");
		cartoon =new JLabel(img);
		cartoon.setBounds(100,197,440,330);
		add(cartoon);
		
		buttonmin=new JButton();//添加最小按钮
	    buttonmin.setBorderPainted(false);
		buttonmin.setBounds(1175,22,40,31); //设置最小按钮大小
	    Icon icon=new ImageIcon(".//min1.jpg");//创建最小图标对象
	    buttonmin.setIcon(icon);	      //设置最小图标
	    add(buttonmin);//添加最小按钮至窗口
		
		buttonexit=new JButton();
	    buttonexit.setBorderPainted(false);
		buttonexit.setBounds(1220,20,38,30);
	    icon=new ImageIcon(".//exit1.jpg");
	    buttonexit.setIcon(icon);
	    add(buttonexit);
	    buttonexit.addMouseListener(new MouseAdapter() {    // 对buttonexit按钮添加监听事件
	        @Override
	        public void mouseClicked(MouseEvent e) {    // 当鼠标点击时
	            System.exit(0);        // 退出
	        }
	    });
		
		  buttonPlay=new JButton();
	      buttonPlay.setBorderPainted(false);
		  buttonPlay.setBounds(90,687,43,45); 
	      icon=new ImageIcon(".//play.jpg");
	      buttonPlay.setIcon(icon);
	      add(buttonPlay);
	      buttonPlay.addActionListener(this);
	      
	      buttonPrev=new JButton();
	      buttonPrev.setBorderPainted(false);
	      buttonPrev.setBounds(40,690,38,40);
	      icon=new ImageIcon(".//prev.jpg");
	      buttonPrev.setIcon(icon);
	      add(buttonPrev);
	      buttonPrev.addActionListener(this);
	      
	      buttonNext=new JButton();
	      buttonNext.setBorderPainted(false);
	      buttonNext.setBounds(145,690,38,40);
	      icon=new ImageIcon(".//next.jpg");
	      buttonNext.setIcon(icon);
	      add(buttonNext);
	      buttonNext.addActionListener(this);
	      
	      buttonlist=new JButton();
	      buttonlist.setBorderPainted(false);
	      buttonlist.setBounds(1078,696,30,30);
	      icon=new ImageIcon(".//listplay.jpg");
	      buttonlist.setIcon(icon);
	      add(buttonlist);
	      buttonlist.addActionListener(this);
      
	      buttonOpen=new JButton();
	      buttonOpen.setBorderPainted(false);
	      buttonOpen.setBounds(1130,700,25,25);
	      icon=new ImageIcon(".//open.jpg");
	      buttonOpen.setIcon(icon);
	      add(buttonOpen);
	      buttonOpen.addActionListener(this);
	      
	      buttonList1=new JButton();
	      buttonList1.setBorderPainted(false);
	      buttonList1.setBounds(1180,696,30,30);
	      icon=new ImageIcon(".//list1.jpg");
	      buttonList1.setIcon(icon);
	      add(buttonList1);
	      buttonList1.addActionListener(this);
	      
	      listPlayFile=new JList();	  //创建播放列表 
	      listPlayFile.setBounds(680,125,300,200); //设置播放列表大小 
	      listPlayFile.setOpaque(false);//设置播放列表透明
	      listPlayFile.setVisible(false);
	      listPlayFile.setBackground(new Color(0, 0, 0, 0));//设置播放列表背景颜色
	      listPlayFile.setForeground(Color.blue);//设置播放列表字体颜色
	      Font font=new Font("隶书",Font_PLAIN,20);
	      listPlayFile.setFont(font);
	      add(listPlayFile);       //添加播放列表至窗口中
	      listPlayFile.addMouseListener(new MouseAdapter(){
	    	  public void mouseClicked(MouseEvent e){
	    			if(e.getClickCount()==2){
	    				int i = listPlayFile.getSelectedIndex();
	    	            playPath=Music.get(i).musicPath;
	    	            playName=Music.get(i).musicName;
	    	            nTimer.cancel();
	    				play_init(playName,playPath);
	    			}
	    		}
	      });
	      
	      textLyrics1=new JTextPane(); //创建已播放歌词控件
	      textLyrics1.setBounds(1020,100,250,250);
	      textLyrics1.setForeground(Color.red);
	      Font f=new Font("隶书",Font_PLAIN,20);
	      textLyrics1.setFont(f);
	      textLyrics1.setOpaque(false);
	      add(textLyrics1);
	      
	      textLyrics2=new JTextPane(); //创建当前播放歌词控件
	      textLyrics2.setBounds(1010,350,250,36);
	      textLyrics2.setForeground(Color.BLUE);
	      f=new Font("隶书",Font_PLAIN,22);
	      textLyrics2.setFont(f);
	      textLyrics2.setOpaque(false);
	      textLyrics2.setText("请先打开文件!");
	      add(textLyrics2);
	      
	      textLyrics3=new JTextPane();   //创建未播放歌词控件    
		  textLyrics3.setBounds(1020,390,250,258);//设置歌词控件大小
		  textLyrics3.setForeground(Color.red);//歌词控件字体颜色
		  f=new Font("隶书",Font.PLAIN,20);
		  textLyrics3.setFont(f);
		  textLyrics3.setOpaque(false);//歌词控件透明
		  add(textLyrics3);    //添加歌词控件至窗口中
	      
	      time=new JTextPane();//定义时间显示窗
	      time.setBounds(200,696,50,25);
	      time.setForeground(Color.BLACK);
	      f=new Font("仿宋",Font_PLAIN,15);
	      time.setFont(f);
	      time.setOpaque(false);
	      add(time);
	      
	      Icon img2=new ImageIcon(".//time.jpg");     //创建图标对象
	      playTime = new JLabel(img2);	  		//创建播放进度条对象
	      playTime.setBounds(265,707,713,6);	  	//设置播放进度条对象大小	      
	      add(playTime); //添加播放进度条至窗口中
	}		
	
	public  void timerFun(){//定时器函数
		if(nTimer!=null){nTimer.cancel();}//已经有定时器则关闭
        nTimer = new Timer();//创建定时器
        nTimer.schedule(new TimerTask(){  //匿名类
        	int n=0;  
        	int nPlayTime=0;//设置播放时间
            public void run() { //定时器
            	playTime.setBounds(265,707, nPlayTime+=6, 6); 
            	int t=nPlayTime/6;//秒
            	if(t<=9){
            		time.setText("00:0"+t);
            	}
            	else if(t<60){
            		time.setText("00:"+t);
            	}
            	else if(t<=69){
            		int a=t/60;
            		int b=t%60;
            		time.setText("0"+a+":0"+b);
            	}
            	else{
            		int a=t/60;
            		int b=t%60;
            		time.setText("0"+a+":"+b);
            	}
            	String s="";
            	String s1="";
            	if (t==time0[n]) {
            		textLyrics2.setText(lyc[n]);
            		for(int i=n+1;i<lyc.length;i++) {
            			s=s+lyc[i];
            		}
            		textLyrics3.setText(s);
            		if(n<=9){
            			for(int i=0;i<=(9-n);i++){
            				s1+="\n";
            			}
            			for(int i=0;i<n;i++){
            				s1+=lyc[i];
            			}
            			textLyrics1.setText(s1);
            		}
            		else {
            			for(int i=n-1;i>=(n-10);i--){
            				s1=lyc[i]+s1;
            			}
            			textLyrics1.setText(s1);
            		}
          		  n++;
            	}
            	if(t==TIME){
            		nTimer.cancel();
            		switch(schemaflag){
            			 case 0:{
            				int m = 0;
            				for(int i=Music.size()-1;i>=0;i--){
            					if(Music.get(i).musicPath.equals(playPath)){
            						m = i;
            						break;
            					}
            				}
            				if(m+1>=Music.size()){
            					playPath=Music.get(0).musicPath;
                    			playName=Music.get(0).musicName;
                    			play_init(playName,playPath);
            				}
            				else{
            					playPath=Music.get(m+1).musicPath;
                    			playName=Music.get(m+1).musicName;
                    			play_init(playName,playPath);
            				}
            			}
            			case 1:{
            				play_init(playName,playPath);
            			}
            			case 2:{
            				Random random=new Random();
            				int m=random.nextInt(Music.size());
            				playPath=Music.get(m).musicPath;
                			playName=Music.get(m).musicName;
                			play_init(playName,playPath);
            			}
            		}
            	}
            }
        },0,1000);
    }
}
public class MusicPlay{
    public static void main(String[] args) { 
        final MyExtendsJFrame frame=new MyExtendsJFrame();//创建窗口
        frame.buttonmin.addActionListener(new ActionListener(){//点集最小化按钮实现最小化
            @Override public void actionPerformed(ActionEvent e){
                frame.setExtendedState(JFrame.ICONIFIED);
            }
        });
		new MobileTool(frame);
    }
}

.\\表示当前工程下目录

图片的话可以自己用ps抠。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值