⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wplayer.java

📁 支持播放列表一系列操作 支持歌词秀 音频支持格式wav snd midi
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.filechooser.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.sound.sampled.*;

public class WPlayer extends JFrame implements Runnable, ActionListener, ItemListener, AdjustmentListener
{
	JLabel lbMusicInfo = new JLabel("", JLabel.LEFT);
	JLabel lbTimeDisp = new JLabel("0:00", JLabel.RIGHT);
	
	int sbVolumeMax = 100;
	int sbVolumeMin = 0;
	int sbVolumeValue = 0;
	int sbVolumeExtent = 0;
	int sbProgressMax = 500;
	int sbProgressMin = 0;
	int sbProgressValue = 0;
	int sbProgressExtent = 0;
			
	JScrollBar sbVolume = new JScrollBar(JScrollBar.VERTICAL, sbVolumeValue, sbVolumeExtent, sbVolumeMin, sbVolumeMax);
	JScrollBar sbProgress = new JScrollBar(JScrollBar.HORIZONTAL, sbProgressValue, sbProgressExtent, sbProgressMin, sbProgressMax);
	
	JButton btStop = new JButton("停止");
	JButton btStart = new JButton("播放");
	JButton btPrevious = new JButton("上一首");
	JButton btNext = new JButton("下一首");
	JButton btOpen = new JButton("打开");
	JButton btSilence = new JButton("静音");
	
	JButton btList = new JButton();
	JButton btLyric = new JButton();
	
	JMenuBar menuBar = new JMenuBar();
	JMenu mnAdd = new JMenu("添加");
		JMenuItem miFile = new JMenuItem("文件");
		JMenuItem miFolder = new JMenuItem("文件夹");
	JMenu mnDelete = new JMenu("删除");
		JMenuItem miSelected = new JMenuItem("选中的文件");
		JMenuItem miRepeated = new JMenuItem("重复的文件");
		JMenuItem miNonexistent = new JMenuItem("错误的文件");
		JMenuItem miDeleteAllFiles = new JMenuItem("全部删除");
	JMenu mnList = new JMenu("列表");
		JMenuItem miCreateList = new JMenuItem("新建列表");
		JMenuItem miAddList = new JMenuItem("添加列表");
		JMenuItem miOpenList = new JMenuItem("打开列表");
		JMenuItem miSaveList = new JMenuItem("保存列表");
		JMenuItem miDeleteList = new JMenuItem("删除列表");
		JMenuItem miSaveAllLists = new JMenuItem("保存所有列表");
	JMenu mnSort = new JMenu("排序");
		JMenuItem miByName = new JMenuItem("按文件名");
		JMenuItem miByLength = new JMenuItem("按播放长度");
		JMenuItem miRandomSort = new JMenuItem("随机排序");
	JMenu mnMode = new JMenu("模式");
		JCheckBoxMenuItem cbmiSinglePlay = new JCheckBoxMenuItem("单曲播放");
		JCheckBoxMenuItem cbmiSingleLoop = new JCheckBoxMenuItem("单曲循环");
		JCheckBoxMenuItem cbmiAllLoop = new JCheckBoxMenuItem("全部循环");
		JCheckBoxMenuItem cbmiRandomPlay = new JCheckBoxMenuItem("随机播放");
	JMenu mnAbout = new JMenu("关于");
		JMenuItem miInformation = new JMenuItem("信息");
	
	int playerWidth = 238;
	
	boolean playlistVisible = false;
	boolean lyricVisible = false;
	WPlayerListPanel wpList = new WPlayerListPanel(playerWidth);
	WPlayerLyricFrame wpLrc = new WPlayerLyricFrame();
	
	Thread timerThread;
	int time = 1;	//The time in seconds
	
	Clip musicClip = null;
	FloatControl gainControl = null;
	float dB = 0;
	boolean muteFlag = false;
	BooleanControl muteControl = null;
	
	boolean playingFlag = false;
	String musicName = null;
	

	
	int playMode = PlayMode.ALL_LOOP;
	

	WPlayer()
	{
		super("WPlayer");
		
		btStop.addActionListener(this);
		btStart.addActionListener(this);
		btSilence.addActionListener(this);
		btOpen.addActionListener(this);
		btNext.addActionListener(this);
		btPrevious.addActionListener(this);
		btList.addActionListener(this);
		btLyric.addActionListener(this);
		
		miFile.addActionListener(this);
		miFolder.addActionListener(this);
		
		miCreateList.addActionListener(this);
		miAddList.addActionListener(this);
		miOpenList.addActionListener(this);
		miSaveList.addActionListener(this);
		miDeleteList.addActionListener(this);
		miSaveAllLists.addActionListener(this);
		
		miByName.addActionListener(this);
		miByLength.addActionListener(this);
		miRandomSort.addActionListener(this);
		
		miSelected.addActionListener(this);
		miRepeated.addActionListener(this);
		miNonexistent.addActionListener(this);
		miDeleteAllFiles.addActionListener(this);
		
		cbmiSinglePlay.addItemListener(this);
		cbmiSingleLoop.addItemListener(this);
		cbmiAllLoop.addItemListener(this);
		cbmiRandomPlay.addItemListener(this);
		
		miInformation.addActionListener(this);
		
		
		menuBar.add(mnAdd);
			mnAdd.add(miFile);
			mnAdd.add(miFolder);
		menuBar.add(mnDelete);
			mnDelete.add(miSelected);
			mnDelete.add(miRepeated);
			mnDelete.add(miNonexistent);
			mnDelete.addSeparator();
			mnDelete.add(miDeleteAllFiles);
		menuBar.add(mnList);
			mnList.add(miCreateList); 
			mnList.add(miAddList); 
			mnList.add(miOpenList); 
			mnList.add(miSaveList); 
			mnList.add(miDeleteList);
			mnList.addSeparator();
			mnList.add(miSaveAllLists); 
		menuBar.add(mnSort);
			mnSort.add(miByName); 
			mnSort.add(miByLength); 
			mnSort.add(miRandomSort); 
		menuBar.add(mnMode);
			mnMode.add(cbmiSinglePlay);
			mnMode.add(cbmiSingleLoop);
			mnMode.add(cbmiAllLoop);
			mnMode.add(cbmiRandomPlay);
		switch(playMode)
		{
			case PlayMode.SINGLE:
			{
				cbmiSinglePlay.setState(true);
				break;
			}
			case PlayMode.SINGLE_LOOP:
			{
				cbmiSingleLoop.setState(true);
				break;
			}
			case PlayMode.ALL_LOOP:
			{
				cbmiAllLoop.setState(true);
				break;
			}
			case PlayMode.RANDOM:
			{
				cbmiRandomPlay.setState(true);
				break;
			}
			default:
		}
		menuBar.add(mnAbout);
			mnAbout.add(miInformation);

		setJMenuBar(menuBar);
		
		sbProgress.addAdjustmentListener(this);
		sbVolume.addAdjustmentListener(this);	
			
		JPanel pnPlayInfo = new JPanel(new FlowLayout());
		pnPlayInfo.add(lbTimeDisp);
		pnPlayInfo.add(new JLabel("    "));
		pnPlayInfo.add(lbMusicInfo);
		pnPlayInfo.add(btList);
		pnPlayInfo.add(btLyric);
		
		JPanel pnProgress = new JPanel();
		pnProgress.add(sbProgress);
		
		JPanel pnControlButtons = new JPanel(new GridLayout(2, 0));

		pnControlButtons.add(btStop);
		pnControlButtons.add(btStart);
		pnControlButtons.add(btPrevious);
		pnControlButtons.add(btNext);
		pnControlButtons.add(btOpen);
		pnControlButtons.add(btSilence);
		
		
		JPanel pnMusicInfo = new JPanel(new GridLayout(2, 0));
		pnMusicInfo.add(pnPlayInfo);
		pnMusicInfo.add(sbProgress);
		
		JPanel pnInfo = new JPanel(new GridLayout(0, 1));
		pnInfo.add(pnMusicInfo);
		pnInfo.add(pnControlButtons);
		
		
		JPanel pnControlPanel = new JPanel(new BorderLayout());
		pnControlPanel.add("West", pnInfo);
		pnControlPanel.add("East", sbVolume);
		
		JPanel pnAll = new JPanel(new BorderLayout());
		pnAll.add("North", pnControlPanel);
		pnAll.add("South", wpList);
		add(pnAll);
		
		wpList.setVisible(playlistVisible);
		wpLrc.setVisible(lyricVisible);
		setVisible(true);
		pack();

		setResizable(false);
		setAlwaysOnTop(false);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		wpList.musicListsList = new MusicListsList();
		wpList.musicList = wpList.musicListsList.list[0];

		wpList.refreshPlayListsList(wpList.musicListsList.toStrings());
		if(wpList.musicListsList.getTotal() > 0)
		{
			wpList.setSelectedList(0);
			wpList.refreshPlayList(wpList.musicList.toStrings());
			if(wpList.musicList.getTotal() > 0)
				wpList.setSelectedFile(0);
		}
	}
	
	void stop()
	{
		Thread t = timerThread;
		if(t != null)
		{
			timerThread = null;
			try
			{
				t.join();
			}
			catch(Exception e) {}
		}
		
	}
	
	public void run()
	{
		while(timerThread == Thread.currentThread())
		{
			try
			{
				Thread.sleep(1000);
			}
			catch(Exception e){};
			lbTimeDisp.setText( time / 60 + ":" + ((time % 60 >= 10)
												  ? new Integer(time % 60).toString()
												  : "0" + new Integer(time % 60).toString()));
			if(musicClip != null)
				sbProgressValue = Math.round((float)time 
								* (float)(sbProgressMax - sbProgressMin - sbProgressExtent)  
								/ (float)(musicClip.getMicrosecondLength() / 1000000.0));
			else
				sbProgressValue = 0;
				
			if(sbProgressValue < sbProgressMax)
			{
				
				sbProgress.removeAdjustmentListener(this);
				sbProgress.setValue(sbProgressValue);
				sbProgress.addAdjustmentListener(this);
			}
			else
				sbProgress.setValue(sbProgressMax);
			time++;
			
		}
	}
	

	
	public void itemStateChanged(ItemEvent evt)
	{
		cbmiSinglePlay.removeItemListener(this);
		cbmiSingleLoop.removeItemListener(this);
		cbmiAllLoop.removeItemListener(this);
		cbmiRandomPlay.removeItemListener(this);
		if(evt.getSource() == cbmiSinglePlay)
		{
			playMode = PlayMode.SINGLE;
			cbmiSinglePlay.setState(true);
			cbmiSingleLoop.setState(false);
			cbmiAllLoop.setState(false);
			cbmiRandomPlay.setState(false);
		}
		else if(evt.getSource() == cbmiSingleLoop)
		{
			playMode = PlayMode.SINGLE_LOOP;
			cbmiSinglePlay.setState(false);
			cbmiSingleLoop.setState(true);
			cbmiAllLoop.setState(false);
			cbmiRandomPlay.setState(false);
		}
		else if(evt.getSource() == cbmiAllLoop)
		{
			playMode = PlayMode.ALL_LOOP;
			cbmiSinglePlay.setState(false);
			cbmiSingleLoop.setState(false);
			cbmiAllLoop.setState(true);
			cbmiRandomPlay.setState(false);
		}
		else if(evt.getSource() == cbmiRandomPlay)
		{
			playMode = PlayMode.RANDOM;
			cbmiSinglePlay.setState(false);
			cbmiSingleLoop.setState(false);
			cbmiAllLoop.setState(false);
			cbmiRandomPlay.setState(true);
		}
		cbmiSinglePlay.addItemListener(this);
		cbmiSingleLoop.addItemListener(this);
		cbmiAllLoop.addItemListener(this);
		cbmiRandomPlay.addItemListener(this);
	}
	
	
	public void adjustmentValueChanged(AdjustmentEvent evt)
	{
		
		if(evt.getAdjustable() == sbProgress)
		{
			System.out.println(sbProgress.getValue());
			if(sbProgress.getValue() >= 500)
			{
				
				musicStop();
				stop();
				System.out.println("here2222222222");
				if(wpList.musicList != null)
				{	
					String path = wpList.musicList.getNextMusicPath(playMode);
					if(path != null)
					{						
						musicPlay(path);
						long l = musicClip.getMicrosecondLength() / 1000;
						

						Music selectedFile = wpList.musicList.list[wpList.musicList.getCurrent()];
						selectedFile.reset(Music.getFileName(path), l);
						wpList.refreshPlayList(wpList.musicList.toStrings());
						wpList.setSelectedFile(wpList.musicList.getCurrent());
					}
				}
			}
			else
			{
				long adjustTime;
				sbProgressValue = sbProgress.getValue();
				//System.out.println(sbProgressValue);
				if(musicClip != null)
				{
					adjustTime = (long)Math.ceil((double)sbProgressValue 
								   * (double)musicClip.getMicrosecondLength()
							   	   / (double)(sbProgressMax - sbProgressMin - sbProgressExtent)) + 1000000L;
					boolean play = playingFlag;
					if(play)
					{
						playingFlag = false;
						musicClip.stop();
					}
					musicClip.setMicrosecondPosition(adjustTime);
					time = (int)(adjustTime / 1000000L);
					if(play)
					{
						musicClip.start();
						playingFlag = true;
					}
					wpLrc.setTime(musicClip.getMicrosecondPosition() / 1000);
				}
			}
		}
		else if(evt.getAdjustable() == sbVolume)
		{
			sbVolumeValue = sbVolume.getValue();
			double gain = (double)(sbVolumeMax - sbVolumeValue) / (double)(sbVolumeMax - sbVolumeMin);
									  // number between 0 and 1 (loudest)
			dB = (float)(Math.log(gain) / Math.log(10.0) * 20.0);
			if(playingFlag)
    			gainControl.setValue(dB);
		}
	}
	
	public void musicStop()
	{
		playingFlag = false;
		System.out.println("s1");

		System.out.println("s2");
		if(musicClip != null)
		{	
			musicClip.stop();
			musicClip.close();
			musicClip = null;
			System.out.println("music close");
		}
		
		lbTimeDisp.setText("0:00");
		sbProgressValue = 0;
		sbProgress.setValue(sbProgressValue);
		time = 1;
		btStart.setLabel("播放");
	}
	
	public void musicPlay(String path)
	{
		timerThread = new Thread(this);
		if(musicClip == null)
		{					
			musicClip = Music.loadMusic(path);					
		}
		if(musicClip != null)
		{		
			
	   		musicName = Music.getFileName(path);
	   		
	   		lbMusicInfo.setText(musicName);
	   		wpLrc.setNewLyric(musicName);
		
			//
			System.out.println(musicClip.getMicrosecondLength());
			//
			gainControl = (FloatControl)musicClip.getControl(FloatControl.Type.MASTER_GAIN);
			gainControl.setValue(dB);
			muteControl = (BooleanControl)musicClip.getControl(BooleanControl.Type.MUTE);
			muteControl.setValue(muteFlag);
			timerThread.start();
			musicClip.start();
			musicClip.getMicrosecondLength() ;
			
			wpLrc.setTime(musicClip.getMicrosecondPosition() / 1000);	
			wpLrc.start();		
			playingFlag = true;
			
			btStart.setLabel("暂停");
		}
		else
		{
			JOptionPane.showMessageDialog(null, "无法打开文件", "警告", JOptionPane.INFORMATION_MESSAGE);
		}
	}
	
	public void actionPerformed(ActionEvent evt)
	{
		if(evt.getSource() == btStop)
		{
			
			musicStop();
			stop();
		}

		else if(evt.getSource() == btStart)
		{
			// Create and start the timer thread
			if(playingFlag)
			{
				stop();
				wpLrc.pause();
				musicClip.stop();
				
				playingFlag = false;
				btStart.setLabel("播放");
			}
			else
			{
				if(wpList.getSelectedFile() >= 0)
				{
					if(musicClip == null)
					{					
						wpList.musicList.setNewRecord(wpList.getSelectedFile());					
					}

					musicPlay(wpList.musicList.getMusicPath(wpList.getSelectedFile()));
					if(musicClip != null)
					{			
						long l = musicClip.getMicrosecondLength() / 1000;
						int i = wpList.getSelectedFile();
						if(i >= 0)
						{
							Music selectedFile = wpList.musicList.list[i];
							String path = selectedFile.getPath();
							selectedFile.reset(Music.getFileName(path), l);
							wpList.refreshPlayList(wpList.musicList.toStrings());
							wpList.setSelectedFile(wpList.musicList.getCurrent());
						}
					}	

				}
			}
		}
		else if(evt.getSource() == btNext)
		{
			if(wpList.musicList != null && wpList.musicList.total > 0)
			{
				if(playMode == PlayMode.RANDOM)
				{
					stop();
					musicStop();
					musicPlay(wpList.musicList.list[wpList.musicList.getNext()].getPath());
					wpList.setSelectedFile(wpList.musicList.getCurrent());
				}
				else
				{
					stop();
					musicStop();
					wpList.musicList.currentPP();
					musicPlay(wpList.musicList.list[wpList.musicList.getCurrent()].getPath());
					wpList.setSelectedFile(wpList.musicList.getCurrent());
				}
				if(musicClip != null)
				{
					long l = musicClip.getMicrosecondLength() / 1000;
					int i = wpList.getSelectedFile();
					if(i >= 0)
					{
						Music selectedFile = wpList.musicList.list[i];
						String path = selectedFile.getPath();
						selectedFile.reset(Music.getFileName(path), l);
						wpList.refreshPlayList(wpList.musicList.toStrings());
						wpList.setSelectedFile(wpList.musicList.getCurrent());
					}
				}
			}
		}
		else if(evt.getSource() == btPrevious)
		{
			if(wpList.musicList != null && wpList.musicList.total > 0)
			{
				if(playMode == PlayMode.RANDOM)
				{
					stop();
					musicStop();
					musicPlay(wpList.musicList.list[wpList.musicList.getPrevious()].getPath());
					wpList.setSelectedFile(wpList.musicList.getCurrent());
				}
				else
				{
					stop();
					musicStop();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -