[v_notice]有人说JAVA可以写音乐播放器么?我想说,JAVA可以写音乐播放器,相对于其他一些来说,可能会有些不爽,但是他还是可以实现的![/v_notice]
今天,我就上传一下自己在闲暇时间写的一个简易的音乐播放器,好的,有兴趣的呢,可以复制代码来看一下效果,如果其中有一些代码出现了问题呢,可以评论我,我一定会在第一时间回复哦!
需要的外包支持:
[mp3spi1.9.4.jar](http://pan.baidu.com/s/1qY39y6S) 、[ jmf.jar](http://pan.baidu.com/s/1eSd50VS) 、[ jgoodies-forms-1.8.0-sources.jar](http://pan.baidu.com/s/1cGTmMU) 、 [jaudiotagger-2.0.3.jar](http://pan.baidu.com/s/1jHCYRTO) 、[jl1.0.jar](http://pan.baidu.com/s/1pL8vjg3) (点击即可下载)
外包下载后只需要加到 “引用的库” 中 即可 。
package player;
import java.awt.Color;
import java.awt.Desktop;
import java.awt.Dimension;
import java.awt.FileDialog;
import java.awt.Label;
import java.awt.List;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FilenameFilter;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JProgressBar;
import javax.swing.JRadioButton;
import javax.swing.JTextArea;
import javax.swing.Timer;
import javax.swing.border.EmptyBorder;
import javazoom.jl.decoder.Bitstream;
import javazoom.jl.decoder.BitstreamException;
import javazoom.jl.decoder.Header;
public class Player extends JFrame{
private JButton backplay,frontplay, play,stop,openMusic,online;
private Label MusicName;
private JProgressBar timeJProgressBar;
private JLabel Start;
private JLabel Endtime ;
private JPanel contentPane;
private JTextArea textArea;
private JPopupMenu popupMenu;
private JMenuItem items\[\];
private JRadioButton selfPlay,liebiao,suiji;
private ButtonGroup radiobutton;
String filepath;// 播放文件目录
String filename;// 播放文件名称
AudioInputStream audioInputStream;// 文件流
AudioFormat audioFormat;// 文件格式
SourceDataLine sourceDataLine;// 输出设备
List list;// 文件列表
JLabel labelfilepath;//播放目录显示标签
boolean isStop = true;// 控制播放线程
boolean hasStop = true;// 播放线程状态
int n;//用于切换上一首下一首
int max;//获取歌曲列表的最大下标
int a=0;
public Player(){
Color color=new Color(187,255,255);
//设置主面板样式
setIconImage(Toolkit.getDefaultToolkit().getImage(Player.class.getResource("/images/titleico.png")));
setTitle("\\u8FF7\\u4F60\\u97F3\\u4E50\\u64AD\\u653E\\u5668");
Toolkit toolkit=Toolkit.getDefaultToolkit();
Dimension dimension=toolkit.getScreenSize();
setDefaultCloseOperation(JFrame.EXIT\_ON\_CLOSE);
setBounds((dimension.width-660)/2, (dimension.height-479)/2, 660, 479);
this.setResizable(false);
//添加组件,并定位
//添加jpanel
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setBackground(color);
setContentPane(contentPane);
contentPane.setLayout(null);
//歌曲名称
MusicName=new Label("MusicName");
MusicName.setBounds(14, 23, 500, 18);
contentPane.add(MusicName);
//存储路径
labelfilepath=new JLabel();
labelfilepath.setBounds(310, 68, 500, 18);
contentPane.add(labelfilepath);
//播放进度
timeJProgressBar=new JProgressBar();
timeJProgressBar.setBounds(24, 54, 263, 7);
contentPane.add(timeJProgressBar);
//播放时间
Start = new JLabel("00:00");
Start.setBounds(24, 62, 46, 18);
contentPane.add(Start);
Endtime = new JLabel("00:00");
Endtime.setBounds(260, 62, 46, 18);
contentPane.add(Endtime);
//按钮组件
backplay = new JButton("");
backplay.setIcon(new ImageIcon(Player.class.getResource("/images/back.png")));
backplay.setBounds(24, 93, 38, 30);
contentPane.add(backplay);
play = new JButton("");
play.setIcon(new ImageIcon(Player.class.getResource("/images/play.png")));
play.setBounds(76, 93, 38, 30);
contentPane.add(play);
stop=new JButton("");
stop.setIcon(new ImageIcon(Player.class.getResource("/images/app.png")));
stop.setBounds(128, 93, 38, 30);
contentPane.add(stop);
frontplay = new JButton("");
frontplay.setIcon(new ImageIcon(Player.class.getResource("/images/front.png")));
frontplay.setBounds(180, 93, 38, 30);
contentPane.add(frontplay);
//创建列表
list = new List(10);
list.setBounds(24, 163, 270, 250);
contentPane.add(list);
//播放模式
selfPlay=new JRadioButton("单曲循环", true);
selfPlay.setBounds(380, 335, 100, 20);
selfPlay.setBackground(color);
contentPane.add(selfPlay);
liebiao=new JRadioButton("列表循环", false);
liebiao.setBounds(490, 335, 100, 20);
liebiao.setBackground(color);
contentPane.add(liebiao);
radiobutton=new ButtonGroup();
radiobutton.add(liebiao);
radiobutton.add(selfPlay);
//弹出式菜单
popupMenu=new JPopupMenu();
items=new JMenuItem\[4\];
items\[0\]=new JMenuItem("添加歌曲");
items\[1\]=new JMenuItem("播放歌曲");
items\[2\]=new JMenuItem("删除选中歌曲");
items\[3\]=new JMenuItem("清空列表");
for (int i = 0; i < items.length; i++) { popupMenu.add(items\[i\]); items\[i\].addActionListener(new popupMenuListener()); } textArea=new JTextArea(); textArea.setBounds(308, 85, 300, 18); textArea.setBackground(color); textArea.setEditable(false); contentPane.add(textArea); openMusic=new JButton("添加音乐"); openMusic.setBounds(350, 370, 100, 40); contentPane.add(openMusic); online=new JButton("在线听歌"); online.setBounds(480, 370, 100, 40); contentPane.add(online); backplay.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { // 点击时处理 if (e.getClickCount() == 1) { // 播放上一首 if (filename==null) { JOptionPane.showMessageDialog(null, "未选择歌曲!"); } else { if (n>0) {
filename = list.getItem(n-1);
n--; //
play();timeBar();
} else {
max=list.getItemCount();
filename = list.getItem(max-1);
n=max-1;
play();timeBar();
}
}
}
}
});
play.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
// 点击时处理
if (e.getClickCount() == 1) {
// 播放选中的文件
filename = list.getSelectedItem();
if (filename==null) {
JOptionPane.showMessageDialog(null, "未选择歌曲!");
} else {
play();timeBar();
}
}
}
});
stop.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
// 点击时处理
if (e.getClickCount() == 1) {
// 停止播放
isStop=true;
hasStop=true;
textArea.setText("已停止播放 "+filename);
}
}
});
frontplay.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
// 点击时处理
if (e.getClickCount() == 1) {
// 播放下一首
if (filename==null) {
JOptionPane.showMessageDialog(null, "未选择歌曲!");
} else {
max=list.getItemCount();
if (n==max-1) {
filename=list.getItem(0);
n=0;
play();timeBar();
} else {
filename = list.getItem(n+1);
n++;
play();timeBar();
}
}
}
}
});
list.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
// 双击时处理
if (e.getClickCount() == 2) {
// 播放选中的文件
filename = list.getSelectedItem();
if (filename==null) {
JOptionPane.showMessageDialog(null, "未选中,无法播放");
textArea.setText("未选中,无法播放");
}else{
n=list.getSelectedIndex();//获取
play();timeBar();
}
}
}
@Override
public void mousePressed(MouseEvent arg0) {
checkForTriggerEvent(arg0);
}
@Override
public void mouseReleased(MouseEvent arg0) {
checkForTriggerEvent(arg0);
}
public void checkForTriggerEvent(MouseEvent event){ //方法学于书本 P516
if(event.isPopupTrigger()){
popupMenu.show(event.getComponent(), event.getX(), event.getY());
}
}
});
openMusic.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
open();
}
});
online.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
try {
URI website=new URI("http://music.baidu.com/top");
Desktop desktop=Desktop.getDesktop();
if (Desktop.isDesktopSupported()&&desktop.isSupported(Desktop.Action.BROWSE)) {
desktop.browse(website);
}
} catch (MalformedURLException e1) {
// TODO 自动生成的 catch 块
e1.printStackTrace();
} catch (IOException e1) {
// TODO 自动生成的 catch 块
e1.printStackTrace();
} catch (URISyntaxException e1) {
// TODO 自动生成的 catch 块
e1.printStackTrace();
}
}
});
this.setVisible(true);
}
private void open() {
FileDialog dialog = new FileDialog(this, "Open", 0);
dialog.setFilenameFilter(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".mp3")||name.endsWith(".mid")||name.endsWith(".wav");
}
});
dialog.setVisible(true);
filepath = dialog.getDirectory();
if (filepath != null) {
labelfilepath.setText("目录:" + filepath);
// 显示文件列表
list.removeAll();
File filedir = new File(filepath);
File\[\] filelist = filedir.listFiles();
for (File file : filelist) {
String filename = file.getName().toLowerCase();
if (filename.endsWith(".mp3") || filename.endsWith(".wav")) {
list.add(filename);
}
}
}
}
//获取时间
public static String getAudioPlayTime(String filePath){
FileInputStream stream;
int time = 0;
try {
stream = new FileInputStream(new File(filePath));
int b = stream.available();
Bitstream bt = new Bitstream(stream);
Header h = bt.readFrame();
time = (int) h.total_ms(b);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (BitstreamException e) {
e.printStackTrace();
}
int i = time/1000; //s
int m = i/60;
int s = i%60;
// System.out.println(“mp3时长为:”+i+”s”);
String longtime=new String(m+”:”+s);
return longtime;
}
//自定义进度条的方法
private void timeBar(){
programThread gramthread=new programThread();
gramthread.start();
}
//定义播放的方法
private void play() {
try {
isStop = true;// 停止播放线程
// 等待播放线程停止
textArea.setEditable(true);
textArea.setText("正在播放:" + filename+"\\n");//状态栏显示播放情况
textArea.setEditable(false);
while (!hasStop) {
try {
Thread.sleep(10);
} catch (Exception e) {
}
}
//换行操作
File file = new File(filepath + filename);
MusicName.setText("歌曲名称:" + filename);
// 取得文件输入流
audioInputStream = AudioSystem.getAudioInputStream(file);
audioFormat = audioInputStream.getFormat();
//获取歌曲时长
String time= getAudioPlayTime(filepath+filename);
Endtime.setText(time);
// 转换mp3文件编码
if (audioFormat.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) {
audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
audioFormat.getSampleRate(), 16, audioFormat
.getChannels(), audioFormat.getChannels() * 2,
audioFormat.getSampleRate(), false);
audioInputStream = AudioSystem.getAudioInputStream(audioFormat,
audioInputStream);
}
// 打开输出设备
DataLine.Info dataLineInfo = new DataLine.Info(
SourceDataLine.class, audioFormat,
AudioSystem.NOT_SPECIFIED);
sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);
sourceDataLine.open(audioFormat);
sourceDataLine.start();
// 创建独立线程进行播放
isStop = false;
Thread playThread = new Thread(new PlayThread());
// programThread gramthread=new programThread();
// gramthread.start();
playThread.start();
} catch (Exception e) {
e.printStackTrace();
}
}
class PlayThread extends Thread {
byte tempBuffer\[\] = new byte\[320\];
public void run() {
try {
int cnt;
hasStop = false;
// 读取数据到缓存数据
while ((cnt = audioInputStream.read(tempBuffer, 0,
tempBuffer.length)) != -1) {
if (isStop){
break;
}
if (cnt > 0) {
// 写入缓存数据
sourceDataLine.write(tempBuffer, 0, cnt);
}
}
// Block等待临时数据被输出为空
sourceDataLine.drain();
sourceDataLine.close();
hasStop = true;
} catch (Exception e) {
e.printStackTrace();
System.exit(0);
}
}
}
class xunhuan extends Thread {
@Override
public void run() {
if (a==0) {
if (selfPlay.isSelected()) {
filename = list.getItem(n);
play();
}
if (liebiao.isSelected()) {
max=list.getItemCount();
if (n==max-1) {
filename=list.getItem(0);
n=0;
play();timeBar();
} else {
filename = list.getItem(n+1);
n++;
play();
}
}
}
super.run();
}
}
public static int programTime(String filePath){
FileInputStream stream;
int time = 0;
try {
stream = new FileInputStream(new File(filePath));
int b = stream.available();
Bitstream bt = new Bitstream(stream);
Header h = bt.readFrame();
time = (int) h.total_ms(b);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (BitstreamException e) {
e.printStackTrace();
}
int i = time/1000; //s
return i;
}
//进度条,还是不流畅,一步一步的走
class programThread extends Thread{
Timer timer=new Timer(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
a++;
}
});
int ptime=programTime(filepath+filename);
public void run(){
timeJProgressBar.setMinimum(0);
timeJProgressBar.setMaximum(ptime);
timeJProgressBar.setValue(0);
timer.start();
while (a<ptime) {
timeJProgressBar.setValue(a);
int m=a/60;
int s=a%60;
if (m<9) {
if (s<=9) { String start=new String("0"+m+":0"+s); Start.setText(start); } if (s>9) {
String start=new String("0"+m+":"+s);
Start.setText(start);
}
}
if (m>9) {
if (s<=9) { String start=new String(m+":0"+s); Start.setText(start); } if (s>9) {
String start=new String(m+":"+s);
Start.setText(start);
}
}
if (isStop){
timer.stop();
a=0;
break;
}
}
timer.stop();
a=0;
timeJProgressBar.setValue(a);
Start.setText("00:00");
xunhuan name=new xunhuan();
name.start();
}
}
class popupMenuListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource()==items\[0\]) {
open();
}
if (e.getSource()==items\[1\]) {
filename = list.getSelectedItem();
if (filename==null) {
JOptionPane.showMessageDialog(null, "未选择歌曲!");
} else {
play();
}
}
if (e.getSource()==items\[2\]) {
filename = list.getSelectedItem();
if (filename==null) {
JOptionPane.showMessageDialog(null, "未选择歌曲!");
} else {
list.remove(filename);
}
}
if (e.getSource()==items\[3\]) {
int n=list.getItemCount();
if (n==0) {
JOptionPane.showMessageDialog(null, "不需要清空");
} else {
list.removeAll();
}
}
}
}
public static void main(String\[\] args) {
Player player=new Player();
}
}
感觉不错,留个言顶一下吧!有问题可以通过留言提问哦,如果觉得博主很良心的话,可以在下方“赏”的地方投个币哦~!