📄 wplayer.java
字号:
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 + -