首页>代码>java swing开发微型音乐播放器客户端(可缩放至托盘)>/SmallMusicPlayer/src/com/soft/jframe/PlayerMain.java
package com.soft.jframe;

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.net.URL;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.Timer;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileNameExtensionFilter;

import com.soft.util.PlayMusic;

import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;

import java.awt.AWTException;
import java.awt.Cursor;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.Point;
import java.awt.PopupMenu;
import java.awt.Rectangle;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;

import javax.swing.JList;
import javax.swing.JLabel;
import javax.swing.JComboBox;

/**
 * 音乐播放器制作
 * @author cyw
 * @time 2018-07-03
 */

@SuppressWarnings("serial")
public class PlayerMain extends JFrame implements ActionListener{

	private JPanel contentPane;
	
	//窗口拖拽
	private boolean isMoved;
	private Point pre_point;
	private Point end_point;
	
	private boolean isMin = true;//判断是否第一次关闭
	private String nowmusic="";//正在播放的歌曲名
	
	
	private boolean flag = true;//判断标志
	@SuppressWarnings("rawtypes")
	JList list,pathlist;//歌曲名与歌曲路径列表
	JButton btnStar,btnStop,btnadd;//开始、停止、增加
	@SuppressWarnings("rawtypes")
	JComboBox comboBox;//列表循环
	PlayMusic play;//播放器播放驱动
	String old;//记录旧的路径
	@SuppressWarnings("rawtypes")
	DefaultListModel name_dlm = new DefaultListModel();//歌曲模型
	@SuppressWarnings("rawtypes")
	DefaultListModel path_dlm = new DefaultListModel();//歌曲路径模型
	private JButton btnclearlist;//清空列表
	private JButton btndel;//删除单条
	
	//最小化至托盘
	private TrayIcon trayIcon;//托盘图标
	 
	//logo照片
    String filePath = "/com/soft/music.png";
	 
    //最小化列表
    PopupMenu pmenu = new PopupMenu();       //托盘图标的弹出式菜单
	MenuItem openmenu = new MenuItem("打开");  //弹出菜单的打开选项
	MenuItem closemenu = new MenuItem("关闭");  //弹出菜单的关闭选项
	MenuItem startmenu = new MenuItem("开始/暂停");  //弹出菜单的打开选项
	MenuItem nextmenu = new MenuItem("下一首");  //弹出菜单的打开选项
	MenuItem lastmenu = new MenuItem("上一首");  //弹出菜单的打开选项
	public SystemTray systemtray = SystemTray.getSystemTray();  //得到当前系统托盘
	Image image = Toolkit.getDefaultToolkit().getImage("music.png");//
	
	int selectedindex = 0;//存储列表选择的下标
	@SuppressWarnings("rawtypes")
	private JComboBox comboBox_1;//判断是否播放结束
	private Timer timer = new Timer(0, new ActionListener() {
		
		@Override
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			if(comboBox_1.getSelectedIndex()==1) {
				int loop_index = comboBox.getSelectedIndex();
				int list_size = list.getModel().getSize();
				if(loop_index == 0) {//列表循环
					if(selectedindex>=(list_size-1)){
						list.setSelectedIndex(0);
						pathlist.setSelectedIndex(0);
					}else {
						list.setSelectedIndex(selectedindex+1);
						pathlist.setSelectedIndex(selectedindex+1);
					}
				}else if(loop_index == 1) {//单曲循环
					list.setSelectedIndex(selectedindex);
					pathlist.setSelectedIndex(selectedindex);
				}else if(loop_index == 2) {//随机播放
					Random r = new Random();
					int index = r.nextInt(list_size);
					if(index==selectedindex)
						index = r.nextInt(list_size);
					pathlist.setSelectedIndex(index);
					list.setSelectedIndex(index);
				}
				btnStar.doClick();
				comboBox_1.setSelectedIndex(0);
			}
			if(btnStar.getText() == "暂停"||btnStar.getText().equals("暂停")) {//判断是否在播放状态
				//修改托盘logo的tip
				nowmusic = name_dlm.getElementAt(selectedindex)+"";
				trayIcon.setToolTip("微型音乐播放器――cyw\n正在播放:"+nowmusic);
			}else {
				trayIcon.setToolTip("微型音乐播放器――cyw");
			}
		}
	});
	private JButton btnlast;
	private JButton btnNext;
	
	
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					PlayerMain frame = new PlayerMain();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public PlayerMain() {
		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		setBounds(0, 0, 354, 318);
		
		//设置logo
		URL logourl = getClass().getResource(filePath);
		final Image logoim = new ImageIcon(logourl).getImage();
		setIconImage(logoim);
		
		//设置最小化至托盘
		 try {
	          trayIcon = new TrayIcon(image, "微型音乐播放器――cyw", pmenu);
	          trayIcon.setImageAutoSize(true); // 设置系统图标大小自动。
	          trayIcon.addMouseListener(new MouseAdapter() {
		             public void mouseClicked(MouseEvent e) {
		            	 if (e.getClickCount() == 2) {//双击托盘窗口再现
		            		 setExtendedState(Frame.NORMAL);
		            		 setVisible(true);
		                  }
		             }
		         });
	          systemtray.add(trayIcon); // 将图标添加到系统托盘
	          
	          //隐藏前选择之前下标
	          if(name_dlm.isEmpty()==false) {
	        	  list.setSelectedIndex(selectedindex);
	        	  pathlist.setSelectedIndex(selectedindex);
	          }
	          
	          this.dispose();
	     } catch (AWTException e2) {
	            e2.printStackTrace();
	     }
		 
	        this.addWindowListener(new WindowAdapter() {
	             /*public void windowIconified(WindowEvent e) {
	            	//隐藏前选择之前下标
	            	 if(name_dlm.isEmpty()==false) {
	   	        	  	list.setSelectedIndex(selectedindex);
	   	        	  	pathlist.setSelectedIndex(selectedindex);
	            	 }
	            	 dispose();//窗口最小化时dispose该窗口
	             }*/
	             @Override
	            public void windowClosing(WindowEvent e) {
	            	// TODO Auto-generated method stub
	            	 if(isMin) {//判断是否第一次点击关闭操作
	            		 JOptionPane.showMessageDialog(null, "<html><font color=red>双击界面非控件位置可关闭窗口!!!</font></html>");
	            		 isMin = false;
	            	 }
	            	//隐藏前选择之前下标
	            	 if(name_dlm.isEmpty()==false) {
		   	        	  list.setSelectedIndex(selectedindex);
		   	        	  pathlist.setSelectedIndex(selectedindex);
		             }
	            	dispose();
	            }
	        });
	        
	        //最小化托盘列表监听
	        openmenu.addActionListener(new MenuListen(this));
			closemenu.addActionListener(new MenuListen(this));
			startmenu.addActionListener(new ActionListener() {
				
				@Override
				public void actionPerformed(ActionEvent e) {
					// TODO Auto-generated method stub
					btnStar.doClick();
				}
			});
			lastmenu.addActionListener(new ActionListener() {
				
				@Override
				public void actionPerformed(ActionEvent e) {
					// TODO Auto-generated method stub
					btnlast.doClick();
				}
			});
			nextmenu.addActionListener(new ActionListener() {
				
				@Override
				public void actionPerformed(ActionEvent e) {
					// TODO Auto-generated method stub
					btnNext.doClick();
				}
			});
			pmenu.add(openmenu);            //在弹出式菜单里面加入菜单。
			pmenu.add(closemenu);
			pmenu.add(startmenu);
			pmenu.add(lastmenu);
			pmenu.add(nextmenu);

		
		
		this.setLocationRelativeTo(null);//居中显示
        this.setResizable(false);
        timer.start();
        //setUndecorated(true);//去边框
        //this.setAlwaysOnTop(true);//置顶
		setTitle("\u5FAE\u578B\u97F3\u4E50\u64AD\u653E\u5668");
		movejframe();
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		btnStar = new JButton("开始");
		btnStar.setBounds(5, 10, 104, 37);
		btnStar.setFont(new Font("华文楷体", Font.PLAIN, 20));
		contentPane.add(btnStar);
		btnStar.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
		
		btnStop = new JButton("停止");
		btnStop.setFont(new Font("华文楷体", Font.PLAIN, 20));
		btnStop.setBounds(5, 57, 104, 37);
		btnStop.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
		contentPane.add(btnStop);
		
		list = new JList();
		pathlist = new JList();
		list.setBounds(119, 10, 219, 161);
		JScrollPane jsp = new JScrollPane(list);
		jsp.setBounds(119, 10, 219, 171);
		contentPane.add(jsp);
		
		btnadd = new JButton("\u6DFB\u52A0\u64AD\u653E\u5217\u8868");
		btnadd.setFont(new Font("华文楷体", Font.PLAIN, 20));
		btnadd.setBounds(119, 191, 219, 37);
		btnadd.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
		contentPane.add(btnadd);
		
		JLabel lblNewLabel = new JLabel("Copyright\u00AEcyw 2018",JLabel.CENTER);
		lblNewLabel.setBounds(0, 275, 348, 15);
		contentPane.add(lblNewLabel);
		
		btnclearlist = new JButton("\u6E05\u7A7A\u64AD\u653E\u5217\u8868");
		btnclearlist.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if(list.getModel().getSize()>0){
					((DefaultListModel)pathlist.getModel()).removeAllElements();
					((DefaultListModel)list.getModel()).removeAllElements();
					selectedindex = 0;
				}
				btnStop.doClick();
			}
		});
		btnclearlist.setFont(new Font("华文楷体", Font.PLAIN, 20));
		btnclearlist.setBounds(119, 234, 219, 37);
		btnclearlist.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
		contentPane.add(btnclearlist);
		
		btndel = new JButton("\u5220\u9664");
		btndel.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if(list.getModel().getSize()>0) {
					String getf = (String) pathlist.getSelectedValue();
					int geti = pathlist.getSelectedIndex();
					if(getf==old||getf.equals(old)) 
						btnStop.doClick();
					((DefaultListModel)pathlist.getModel()).removeElementAt(geti);
					((DefaultListModel)list.getModel()).removeElementAt(geti);
					pathlist.setSelectedIndex(selectedindex);
					list.setSelectedIndex(selectedindex);
					selectedindex = pathlist.getSelectedIndex();
				}
			}
		});
		btndel.setFont(new Font("华文楷体", Font.PLAIN, 20));
		btndel.setBounds(5, 198, 104, 37);
		btndel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
		contentPane.add(btndel);
		
		comboBox = new JComboBox();
		comboBox.setBounds(5, 244, 104, 27);
		comboBox.addItem("列表循环");
		comboBox.addItem("单曲循环");
		comboBox.addItem("随机播放");
		comboBox.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
		contentPane.add(comboBox);
		
		btnlast = new JButton("\u4E0A\u4E00\u66F2");
		btnlast.setFont(new Font("华文楷体", Font.PLAIN, 20));
		btnlast.setBounds(5, 104, 104, 37);
		btnlast.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
		contentPane.add(btnlast);
		
		btnNext = new JButton("\u4E0B\u4E00\u66F2");
		btnNext.setFont(new Font("华文楷体", Font.PLAIN, 20));
		btnNext.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
		btnNext.setBounds(5, 151, 104, 37);
		contentPane.add(btnNext);
		
		comboBox_1 = new JComboBox();
		comboBox_1.setBounds(5, 187, 104, 21);
		comboBox_1.addItem("0");
		comboBox_1.addItem("1");
		this.addMouseListener(new Dbclick());
		btnadd.addActionListener(this);
		btnStar.addActionListener(this);
		btnStop.addActionListener(this);
		btnlast.addActionListener(this);
		btnNext.addActionListener(this);
		list.addMouseListener(new ListDbclick());
		list.addListSelectionListener(new ListSelectionListener() {
			
			@Override
			public void valueChanged(ListSelectionEvent e) {
				// TODO Auto-generated method stub
				pathlist.setSelectedIndex(list.getSelectedIndex());
				if(list.getSelectedIndex()==-1){
					list.setSelectedIndex(0);
					pathlist.setSelectedIndex(0);
				}
			}
		});
		
	}
	
	// 鼠标拖拽移动窗口
		public void movejframe() {
			this.setDragable(this);
		}

		private void setDragable(final PlayerMain move) {
			this.addMouseListener(new java.awt.event.MouseAdapter() {
				public void mouseReleased(java.awt.event.MouseEvent e) {
					isMoved = false;
					move.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
				}

				public void mousePressed(java.awt.event.MouseEvent e) {
					isMoved = true;
					pre_point = new Point(e.getX(), e.getY());
					move.setCursor(new Cursor(Cursor.MOVE_CURSOR));
				}
			});
			this.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
				public void mouseDragged(java.awt.event.MouseEvent e) {
					if (isMoved) {
						end_point = new Point(move.getLocation().x + e.getX() - pre_point.x,
								move.getLocation().y + e.getY() - pre_point.y);
						move.setLocation(end_point);
					}
				}
			});
		}
	
	/**
	 * 双击非控件区域关闭窗口
	 * @author cyw
	 *
	 */
	class Dbclick extends MouseAdapter{
		@Override
		public void mouseClicked(MouseEvent e) {
			// TODO Auto-generated method stub
			int clickTimes = e.getClickCount();
		    if (clickTimes == 2) {
		      if(JOptionPane.showConfirmDialog(null,"确定关闭程序吗?","询问", JOptionPane.YES_NO_OPTION)==JOptionPane.YES_OPTION)
		    	  //dispatchEvent(new WindowEvent(new login(), WindowEvent.WINDOW_CLOSING));
		    	  System.exit(0); 
		    }
		}
	}
	
	//列表内双击
	class ListDbclick extends MouseAdapter{
		@Override
		public void mouseClicked(MouseEvent e) {
			// TODO Auto-generated method stub
			int clickTimes = e.getClickCount();
		    if (clickTimes == 2) {
		      String filename = (String) pathlist.getSelectedValue();
		      selectedindex = pathlist.getSelectedIndex();
		      if(flag == true) {
					old = filename;
					play = new PlayMusic(filename,btnStar,comboBox_1);
					flag = false;
					play.start();
					btnStar.setText("暂停");
				}else if(flag == false&&old != filename){
					old = filename;
					play.stop();
					play = new PlayMusic(filename,btnStar,comboBox_1);
					flag = false;
					play.start();
					btnStar.setText("暂停");
				}else if(flag == false&&old == filename){
					if(play.isComplete()) {
						play.stop();
						old = filename;
						play = new PlayMusic(filename,btnStar,comboBox_1);
						flag = false;
						play.start();
						btnStar.setText("暂停");
					}else {
						JOptionPane.showMessageDialog(null, "<html><font color=red>歌曲播放中</font></html>");
					}
				}
		    }
		}
	}

	@SuppressWarnings({ "static-access", "unchecked" })
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		if(e.getSource()==btnadd) {//将歌曲添加到列表
			selectedindex = 0;//默认下标为0
			JFileChooser filechooser = new JFileChooser("C:\\Users\\Administrator\\Desktop");//文件选择器默认打开地址
			filechooser.setDialogTitle("请选择音乐播放路径!");//文件选择器标题
			FileFilter filter1 = new FileNameExtensionFilter("*.mp3", "mp3");//文件格式过滤
			filechooser.setFileFilter(filter1);
			filechooser.setMultiSelectionEnabled(true);
			int i = filechooser.showOpenDialog(null);
			if(i == filechooser.APPROVE_OPTION) {//点击确定后操作
				File[]  f= filechooser.getSelectedFiles(); //获取到选择的值
				String abpath,name;
				for (int z = 0; z < f.length; z++) {
					abpath = f[z].getAbsolutePath();
					name = f[z].getName();
					path_dlm.addElement(abpath);
					name_dlm.addElement(name.substring(0, name.length()-4));//删去.mp3
				}
				
				//添加模型
				list.setModel(name_dlm);
				pathlist.setModel(path_dlm);
				
				//默认选第一项
				list.setSelectedIndex(0);
				pathlist.setSelectedIndex(0);
			}
		}else if(e.getSource() == btnStar) {//开始按钮监听
			String filename = (String) pathlist.getSelectedValue();//获得歌曲路径
			if(filename!=null) {
				selectedindex = pathlist.getSelectedIndex();
				if(flag == true&&btnStar.getText()=="开始") {
					old = filename;
					play = new PlayMusic(filename,btnStar,comboBox_1);//将要传的参数传至函数中
					flag = false;
					play.start();//开始线程
					btnStar.setText("暂停");
				}else if(flag == false&&btnStar.getText()=="开始"&&old != filename){
					old = filename;
					play.stop();
					play = new PlayMusic(filename,btnStar,comboBox_1);
					flag = false;
					play.start();
					btnStar.setText("暂停");
				}else if(flag == false&&btnStar.getText()=="开始"&&old == filename){
					if(play.isComplete()) {
						play.stop();
						old = filename;
						play = new PlayMusic(filename,btnStar,comboBox_1);
						flag = false;
						play.start();
						btnStar.setText("暂停");
					}else {
						play.resume();//线程恢复
						btnStar.setText("暂停");
					}
				}else if(btnStar.getText()=="暂停") {
					play.suspend();//线程挂起即歌曲暂停
					btnStar.setText("开始");
				}
				//列表定位到选项位置
				Rectangle rectangle = list.getCellBounds(selectedindex, selectedindex);
				list.scrollRectToVisible(rectangle);
			}else {
				if(list.getModel().getSize()>0) {//无歌曲判定
					selectedindex = 0;
					filename = list.getModel().getElementAt(0)+"";
					list.setSelectedIndex(0);
					pathlist.setSelectedIndex(0);
					old = filename;
					play = new PlayMusic(filename,btnStar,comboBox_1);
					flag = false;
					play.start();
					btnStar.setText("暂停");
				}else {
					JOptionPane.showMessageDialog(null, "<html><font color=red>请先添加播放曲目</font></html>");
				}
					
			}
		}else if(e.getSource() == btnStop) {//停止按钮监听,将一切重置
			selectedindex = 0;
			play.stop();
			btnStar.setText("开始");
			flag = true;
			old="";
		}else if(e.getSource() == btnlast) {//上一曲按钮监听
			selectedindex = pathlist.getSelectedIndex();//获取歌曲路径
			int loop_index = comboBox.getSelectedIndex();//获取循环下拉框
			int list_size = list.getModel().getSize();//得到模型的大小
			btnStar.setText("开始");
			if(loop_index == 2){//随机播放
				Random r = new Random();
				int index = r.nextInt(list_size);
				if(index==selectedindex)//避免随机同一首歌
					index = r.nextInt(list_size);
				pathlist.setSelectedIndex(index);
				list.setSelectedIndex(index);
			}else{
				if(selectedindex>0) {//下标大于等于1时向上退
					list.setSelectedIndex(selectedindex-1);
					pathlist.setSelectedIndex(selectedindex-1);
				}
			}
			btnStar.doClick();
		}else if(e.getSource() == btnNext) {//下一曲按钮监听
			selectedindex = pathlist.getSelectedIndex();//获取路径
			int size = list.getModel().getSize();//获取模型大小
			btnStar.setText("开始");
			if(size>1) {//当超过一首歌时下一曲才启用
				int loop_index = comboBox.getSelectedIndex();
				int list_size = list.getModel().getSize();
				if(loop_index == 2){//随机播放
					Random r = new Random();
					int index = r.nextInt(list_size);
					if(index==selectedindex)//避免随机同一首歌
						index = r.nextInt(list_size);
					pathlist.setSelectedIndex(index);
					list.setSelectedIndex(index);
				}else{
					if(selectedindex<(size-1)) {//非最后一曲时向前进一手
						pathlist.setSelectedIndex(selectedindex+1);
						list.setSelectedIndex(selectedindex+1);
					}
				}
				btnStar.doClick();
			}
		}
	}
	
	/**
	 * 最小化列表监听
	 * @author cyw
	 *
	 */
	class MenuListen implements ActionListener {
		public JFrame jf = null;

		public MenuListen(JFrame jf) {//构造函数
			this.jf = jf;
		}

		public void actionPerformed(ActionEvent e) {
			if (e.getActionCommand().equals("关闭")) {
				if(JOptionPane.showConfirmDialog(null,"确定关闭程序吗?","询问", JOptionPane.YES_NO_OPTION)==JOptionPane.YES_OPTION)
					System.exit(0); //关闭窗口
			} else
				jf.setVisible(true);//显示窗口
		}

	}
	
	

}
最近下载更多
你是傻子  LV9 2023年11月28日
pangzhihui  LV12 2023年11月13日
另类清晨  LV8 2023年5月15日
初心不负丶方得始终  LV10 2023年4月21日
wmm500  LV3 2022年12月2日
xuanmu1  LV1 2022年7月22日
1019796174  LV1 2022年6月29日
wanglinddad  LV54 2022年6月25日
段朝洪  LV15 2021年12月21日
ʚ*ɞ  LV1 2021年12月19日
最近浏览更多
cxz2132132  LV11 2023年12月9日
你是傻子  LV9 2023年11月28日
入场哇t  LV1 2023年11月27日
hanskkkkkkk 2023年11月27日
暂无贡献等级
pangzhihui  LV12 2023年11月13日
NicLee 2023年7月7日
暂无贡献等级
lzl111213  LV1 2023年6月21日
17683946472  LV9 2023年6月8日
另类清晨  LV8 2023年5月15日
初心不负丶方得始终  LV10 2023年4月21日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友