java写的音乐播放器

时间:2021-05-12 05:02:53

 

这个是源码结构介绍

java写的音乐播放器

这个是界面,有点简陋,见笑了,但是基本上的东西都有了,没办法,没有美工的程序写的界面就是很操蛋

java写的音乐播放器

直接上源代码Player.java

package com.service;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;

import javax.sound.sampled.*;
import javax.swing.JSlider;
import javax.swing.JTable;

import com.list.MusicList;
import com.list.ThreadList;
import com.list.ViewList;
import com.model.Model;
import com.model.Music;
import com.view.View;



/*"duration"
"author"
"title"
"copyright"
"date"
"comment"
*/
public class Player extends Thread{



private Player p;
private long time = 0;

Object lock
= new Object();//一个空的对象,没什么意义

private boolean paused = false;// 暂停 继续


public boolean isPaused() {
return paused;
}

public void setPaused(boolean paused) {
this.paused = paused;
}

private JSlider jSliderPlayProgress;//播放进度条


private boolean over = false;//开始 结束

//是否自动播放下一曲
private boolean isNext=true;


private Music music;//音乐


AudioInputStream din
= null;
SourceDataLine line
=null;

private FloatControl volume = null;

private JSlider jSliderVolume;

public JSlider getjSliderVolume() {
return jSliderVolume;
}

public void setjSliderVolume(JSlider jSliderVolume) {
this.jSliderVolume = jSliderVolume;


}
public Player(JSlider jSliderVolume,JSlider jSliderPlayProgress) {
super();
this.jSliderVolume = jSliderVolume;
this.jSliderPlayProgress=jSliderPlayProgress;
}


public Music getMusic() {
return music;
}

public void setMusic(Music music) {
this.music = music;
}

public FloatControl getVolume(){
return volume;
}



//播放音乐
public void run(){

AudioInputStream in
=null;

try {

File file
= new File(music.getPath());

//播放不了的歌曲,直接下一首,并且在音乐列表中删除
try {
in
= AudioSystem.getAudioInputStream(file);
}
catch (Exception e) {
//删除有点小问题
MusicList.getList().remove(music.getId());

ViewList.getList().get(
0).getJt().setModel(new Model());


nextmusic();
}

AudioFormat baseFormat
= in.getFormat();
AudioFormat decodedFormat
= new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED,
baseFormat.getSampleRate(),
16, baseFormat.getChannels(),
baseFormat.getChannels()
* 2, baseFormat.getSampleRate(),
false);
if(baseFormat.getEncoding()==AudioFormat.Encoding.PCM_UNSIGNED || baseFormat.getEncoding()==AudioFormat.Encoding.ULAW ||
baseFormat.getEncoding()
==AudioFormat.Encoding.ALAW || baseFormat.getEncoding()==AudioFormat.Encoding.PCM_SIGNED){
time
=(file.length()*8000000)/((int)(decodedFormat.getSampleRate()*baseFormat.getSampleSizeInBits()));
}
else{
int bitrate=0;
if(baseFormat.properties().get("bitrate")!=null){
//取得播放速度(单位位每秒)
bitrate=(int)((Integer)(baseFormat.properties().get("bitrate")));
if(bitrate!=0)
time
=(file.length()*8000000)/bitrate;
}

}


din
= AudioSystem.getAudioInputStream(decodedFormat, in);
DataLine.Info info
= new DataLine.Info(SourceDataLine.class, decodedFormat);
line
= (SourceDataLine) AudioSystem.getLine(info);
line.open();
setVolume();
jSliderPlayProgress.setMaximum((
int)time);
jSliderPlayProgress.setValue(
0);
if(line!=null){
line.open(decodedFormat);
byte[] data = new byte[4096];
int nBytesRead;

synchronized (lock) {
while ((nBytesRead = din.read(data, 0, data.length)) != -1) {
while (paused) {
if(line.isRunning()) {
line.stop();
System.out.println(
"暂停");
}
try {
lock.wait();
System.out.println(
"等待");
}
catch(InterruptedException e) {
}
}
if(!line.isRunning()&&!over) {
System.out.println(
"开始播放");
line.start();

}

if (over&&line.isRunning()) {
System.out.println(
"停止播放");
jSliderPlayProgress.setValue(
0);
isNext
=false;
line.drain();
line.stop();
line.close();
}

jSliderPlayProgress.setValue((
int)line.getMicrosecondPosition());
line.write(data,
0, nBytesRead);
}

//根据播放模式选择下一首歌
nextmusic();
}

}

}
catch(Exception e) {
e.printStackTrace();
}
finally {
if(din != null) {
try { din.close(); } catch(IOException e) { }
}
}
}

//设置播放器滚动条
public void setVolume()
{
if(line!=null)
{
if(line.isControlSupported(FloatControl.Type.MASTER_GAIN))
{
jSliderVolume.setEnabled(
true);
volume
= (FloatControl)line.getControl( FloatControl.Type.MASTER_GAIN );
jSliderVolume.setMinimum((
int)volume.getMinimum());
jSliderVolume.setMaximum((
int)volume.getMaximum());
//jSliderVolume.setValue((int)(volume.getMinimum()+(4*(volume.getMaximum()-volume.getMinimum()))/5));
volume.setValue((float)(volume.getMinimum()+(4*(volume.getMaximum()-volume.getMinimum()))/5));
}
}
else
{
volume
=null;
jSliderVolume.setEnabled(
false);
}
}
private void nextmusic() {
String mode
=Setting.getMode();
if (isNext&&!mode.equals("one")) {//单曲播放就不执行
int nextid=0;//将要播放的id
int currentid=Integer.parseInt(this.music.getId());
System.out.println(mode);
if (mode.equals("default")&&(currentid==MusicList.getList().size()-1)){
return;
}

if (mode.equals("rand")) {
Random random
= new Random();
nextid
=Math.abs(random.nextInt())%MusicList.getList().size();
}
else if (mode.equals("onecircle")) {
nextid
=currentid;
}
else if (mode.equals("default")&&!(currentid==MusicList.getList().size()-1)) {
nextid
=currentid+1;
}
else if (mode.equals("morecircle")) {

nextid
=(currentid==MusicList.getList().size()-1)?0:currentid+1;
}
JTable jTable
=ViewList.getList().get(0).getJt();
if(nextid==0){//第一个

jTable.setRowSelectionInterval(
0,0);

}
else {
jTable.setRowSelectionInterval(nextid
-1,nextid);
}
this.stopplay();
ThreadList.getList().clear();
p
=new Player(jSliderVolume,jSliderPlayProgress);
p.setMusic(MusicList.getList().get(nextid));
ThreadList.getList().add(p);
p.start();
}
}



//开始
public void startplay(){
over
=false;
}


//停止

public void stopplay(){
over
=true;
}


// 暂停
public void userPressedPause() {
paused
= true;
}

//继续
public void userPressedPlay() {
synchronized(lock) {
paused
= false;
lock.notifyAll();
}

}

public void Pause(){
if (paused) {
synchronized(lock) {
paused
= false;
lock.notifyAll();
}
}
else{
paused
= true;
}

}




}

 

这个主要是播放音乐的类,播放,暂停,停止,上一首,下一首都有了

 

 View.java

package com.view;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URL;
import java.util.ArrayList;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRootPane;
import javax.swing.JScrollPane;
import javax.swing.JSlider;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.table.TableCellRenderer;



import com.list.MusicList;
import com.list.ThreadList;
import com.list.ViewList;
import com.model.Model;
import com.model.Music;
import com.service.Player;
import com.service.Setting;
import com.util.DirInput;
import com.util.FileInput;
import com.util.FileList;
import com.util.List_File;


public class View extends JFrame implements MouseListener,ActionListener,WindowListener {

private JButton stop, open,del,next,pre;
private Player p;
private JPanel[] jPanels;
private MusicList list;
//private Long clickTime=0l;
private JScrollPane jsp;
private JTable jt;
private JRootPane j;
private Model model;
private JSlider jSliderVolume;
private JSlider jSliderPlayProgress;
private FileInput fileinput;
private DirInput dirInput;
private JMenuBar jb;
private JMenu jm;
private JMenuItem fm,dm;
private JComboBox jBox;


public View(){
System.out.println(ViewList.getList().size());
if (ViewList.getList().size()==0) {
Open();
}
}



private void Open() {

//this.getRootPane().setWindowDecorationStyle(JRootPane.NONE);


//this.setUndecorated(true);
//菜单选项

jb
=new JMenuBar();
jm
=new JMenu("打开");

fm
=new JMenuItem("文件");

dm
=new JMenuItem("文件夹");

fm.addActionListener(
this);
dm.addActionListener(
this);
jb.add(jm);

jm.add(fm);
jm.add(dm);



//this.setJMenuBar(jb);



JPanel p1
=new JPanel();
JPanel p2
=new JPanel();
JPanel p3
=new JPanel();

//增加菜单选项
j=new JRootPane();

j.setJMenuBar(jb);


p2.add(j);


open
=new JButton("播放");
stop
=new JButton("停止");
open.addMouseListener(
this);
stop.addMouseListener(
this);
pre
=new JButton("上一首");
next
=new JButton("下一首");
pre.addMouseListener(
this);
next.addMouseListener(
this);
p1.setLayout(
new GridLayout(2,1));

JPanel jPanel2
=new JPanel();

jPanel2.add(open);
jPanel2.add(stop);
jPanel2.add(pre);
jPanel2.add(next);

p1.add(jPanel2);
/*p1.add(open);
p1.add(stop);
p1.add(pre);
p1.add(next);
*/





del
=new JButton("删除");
del.addMouseListener(
this);

jSliderPlayProgress
= new JSlider(); //播放进度条
jSliderPlayProgress.setValue(0);
jSliderPlayProgress.setEnabled(
false);
jSliderPlayProgress.setPreferredSize(
new Dimension(200, 20));


p1.add(jSliderPlayProgress);


jSliderVolume
= new JSlider(); //音量进度条
jSliderVolume.setValue(0);
//jSliderPlayProgress.setEnabled(false);
jSliderVolume.setPreferredSize(new Dimension(100, 20));//设置滚动条长度



jSliderVolume.addChangeListener(
new ChangeListener()
{
public void stateChanged(ChangeEvent evt)
{
System.out.println(jSliderVolume.getValue());
if (ThreadList.getList().size()!=0) {
ThreadList.getList().get(
0).getVolume().setValue((float)jSliderVolume.getValue());
}


}
});
String[] v
={"顺序播放","随机播放","单曲循环","列表循环","单曲播放"};

jBox
=new JComboBox(v);

jBox.addActionListener(
this);

p2.add(jBox);
p2.add(del);


p2.add(jSliderVolume);

jPanels
=new JPanel[list.getList().size()];

for (int i = 0; i < list.getList().size(); i++) {

Music music
=list.getList().get(i);

JPanel jPanel
=new MyJPanel(music);


JLabel jLabel
=new JLabel(music.getName(),SwingConstants.CENTER);
jLabel.setSize(
300, 10);
jLabel.setHorizontalTextPosition(JLabel.CENTER);

jPanel.setBackground(Color.WHITE);

jPanels[i]
=jPanel;

jPanel.addMouseListener(
this);

jPanel.add(jLabel);



p3.add(jPanel);


}


p3.setBackground(Color.WHITE);

p3.setLayout(
new GridLayout(10, 1));

p3.setSize(
320, 500);


this.add(p1,BorderLayout.NORTH);
this.add(p2,BorderLayout.SOUTH);






model
=new Model(); //添加表

jt
=new JTable(model){ // 设置jtable的单元格为透明的
public Component prepareRenderer(TableCellRenderer renderer,
int row, int column) {
Component c
= super.prepareRenderer(renderer, row, column);
if (c instanceof JComponent) {
((JComponent) c).setOpaque(
false);
}
return c;
}
};;

jt.setOpaque(
false);

jt.setRowHeight(
30);
jt.setSelectionMode(ListSelectionModel.SINGLE_SELECTION );
jt.setShowHorizontalLines(
false);
jt.setSelectionBackground(
new Color(189,215,238));
jt.addMouseListener(
this);

jsp
= new JScrollPane(jt);

jsp.setOpaque(
false);
jsp.getViewport().setOpaque(
false);


//addmusic();

//this.add(p3,BorderLayout.CENTER);

this.add(jsp,BorderLayout.CENTER);


this.setDefaultCloseOperation(EXIT_ON_CLOSE);

this.addWindowListener(this);

Image image
=this.getToolkit().getImage("img/icon.jpg");

this.setIconImage(image);

this.setTitle("音乐播放器");

ImageIcon icon
= new ImageIcon("img/bg.jpg");
JLabel lab
= new JLabel(icon); // 将图片放入到label中
lab.setBounds(0, 0, icon.getIconWidth(), icon.getIconHeight()); // 设置放有图片的label的位置

this.getContentPane().add(lab, -1); // jthis本身是窗体,不能放置任何组件,用getContentPane()方法得到this的默认内容面板,将lab放入其中,-1表示放入面板的下层
this.getContentPane().add(jsp, 0); // 0表示放在面板的最顶层
Container con = this.getContentPane();
((JPanel)con).setOpaque(
false); // 设置面板为透明的
p2.setOpaque(false);
jSliderVolume.setOpaque(
false);
jPanel2.setOpaque(
false);
p1.setOpaque(
false);
p3.setOpaque(
false);
jSliderPlayProgress.setOpaque(
false);
this.setLocation(400, 200);
this.setSize(337, 525);
this.setResizable(false);
this.setVisible(true);
}

@Override
public void mouseClicked(MouseEvent e) {

System.out.println(
"开始播放");

if (e.getSource()==open) {

if (p==null) {//开始
p=new Player(jSliderVolume,jSliderPlayProgress);
p.setMusic(MusicList.getList().get(
0));
jt.setRowSelectionInterval(
0,0);
ThreadList.add(p);
open.setText(
"暂停");
p.start();
}
else{//继续
if (ThreadList.getList().size()!=0) {
p
=ThreadList.getList().get(0);
}

String s
=p.isPaused()?"暂停":"播放";
open.setText(s);
p.Pause();
}

}
else if (e.getSource()==stop) {
if (ThreadList.getList().size()!=0) {
p
=ThreadList.getList().get(0);
}
if (p!=null) {
p.stopplay();
p
=null;
open.setText(
"播放");
}


}
else if (e.getSource()==pre) {//上一首
premusic();

}
else if (e.getSource()==next) {//下一首
nextmusic();
}
else if (e.getSource()==del) {

delmusic();

}
else if (e.getSource()==jt&&e.getClickCount()==2) {//双击

clickmusic();



}


}

private void clickmusic() {
//双击Jtable
System.out.println("点击了");

int rowNum = this.jt.getSelectedRow();
System.out.println(rowNum);
if(rowNum == -1) {
JOptionPane.showMessageDialog(
this, "你没有选择一项");
return;
}
ArrayList
<Player> list=ThreadList.getList();


System.out.println(list.size()
+"音乐文件数目");

if (list.size()==0) {

p
=new Player(jSliderVolume,jSliderPlayProgress);
p.setMusic(MusicList.getList().get(rowNum));
ThreadList.add(p);
open.setText(
"暂停");
p.start();
}
else{
System.out.println(
"停止");
list.get(
0).stopplay();
list.clear();
p
=new Player(jSliderVolume,jSliderPlayProgress);
p.setMusic(MusicList.getList().get(rowNum));
open.setText(
"暂停");
list.add(p);
p.start();
}
}

private void delmusic() {
int rowNum = this.jt.getSelectedRow();


MusicList.getList().remove(rowNum);

System.out.println(MusicList.getList().size());

jt.setModel(
new Model());


ArrayList
<Player> list=ThreadList.getList();
p
=new Player(jSliderVolume,jSliderPlayProgress);
System.out.println(list.size()
+"大小");
if (list.size()!=0) {
list.get(
0).stopplay();
list.clear();
open.setText(
"暂停");
if(rowNum==0){//第一个
System.out.println("第一个");
jt.setRowSelectionInterval(
0,0);
p.setMusic(MusicList.getList().get(rowNum));


}
else if(rowNum==MusicList.getList().size()){//最后一个
System.out.println("最后一个");

jt.setRowSelectionInterval(rowNum
-2,rowNum-1);
p.setMusic(MusicList.getList().get(rowNum
-1));

}
else {
System.out.println(
"中间");

jt.setRowSelectionInterval(rowNum
-1,rowNum);
p.setMusic(MusicList.getList().get(rowNum));

}
list.add(p);
p.start();
}
}

public JTable getJt() {
return jt;
}

private void premusic() {
System.out.println(
"上一首");

ArrayList
<Player> list=ThreadList.getList();

int id=Integer.parseInt(list.get(0).getMusic().getId());

if(id!=0){
if (id==1) {
jt.setRowSelectionInterval(
0,0);
}
else{
jt.setRowSelectionInterval(id
-2,id-1);
}
System.out.println(id);

list.get(
0).stopplay();
list.clear();

p
=new Player(jSliderVolume,jSliderPlayProgress);

p.setMusic(MusicList.getList().get(id
-1));
System.out.println(id
-1);

open.setText(
"暂停");
list.add(p);
p.start();
}
}

private void nextmusic() {
System.out.println(
"下一首");
ArrayList
<Player> list=ThreadList.getList();
int id=Integer.parseInt(list.get(0).getMusic().getId());

System.out.println(id);
if(id!=MusicList.getList().size()-1){ //122

jt.setRowSelectionInterval(id,id
+1); //123条

list.get(
0).stopplay();
list.clear();

p
=new Player(jSliderVolume,jSliderPlayProgress);

p.setMusic(MusicList.getList().get(id
+1));
System.out.println(id
+1);

open.setText(
"暂停");
list.add(p);
p.start();
}
}
//判断双击
/*
private boolean checkClickTime() {
long nowTime = (new Date()).getTime();
if ((nowTime - clickTime) < 300) {
clickTime = nowTime;
return true;
}
clickTime = nowTime;
return false;
}
*/

private void addmusic(String path) {//增加mp3文件夹

System.out.println(
"增加mp3文件夹");
ArrayList
<Music> musiclist=MusicList.getList();

List_File fm
= new List_File();
ArrayList
<String[]> FileList = fm.serachFiles(path);

for (int i = 0; i < FileList.size(); i++) {
Music music
= new Music();
music.setId(musiclist.size()
+"");
String[] s
=(String[]) FileList.get(i);

music.setName(s[
0]);
music.setPath(s[
1]);
musiclist.add(music);
}

jt.setModel(
new Model());

}

@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub

}



@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource()==fm) {//添加mp3文件
if(fileinput==null) fileinput = new FileInput(this);
fileinput.open();
File[] s
=fileinput.getFiles();
ArrayList
<Music> musiclist=MusicList.getList();


if(s!=null){
for(int i=0;i<s.length;i++){
Music music
= new Music();
music.setId(musiclist.size()
+"");
music.setName(s[i].getName());
music.setPath(s[i].getAbsolutePath());
musiclist.add(music);
jt.setModel(
new Model());
}
}
}
else if (e.getSource()==dm) {


if(dirInput==null) dirInput = new DirInput(this);

dirInput.open();

File s
=dirInput.getFile();


if(s!=null){

addmusic(s.getAbsolutePath());
}



}
else if (e.getSource()==jBox) {
//顺序播放 (默认)default 随机rand 单曲循环 onecircle 列表循环 morecircle 单曲播放 one


if (ThreadList.getList().size()!=0) {
p
=ThreadList.getList().get(0);
}
else {
p
=new Player(jSliderVolume,jSliderPlayProgress);
ThreadList.getList().add(p);
}

String[] s
={"default","rand","onecircle","morecircle","one"};

Setting.setMode(s[jBox.getSelectedIndex()]);


}
}



@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub

}



@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
System.out.println("关闭kk");
}



@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
System.out.println("close");

if (MusicList.getList().size()!=0) {
System.out.println(
"写入文件");
//清空之前的内容
FileList.clear("file/musiclist.txt");
ArrayList
<Music> list=MusicList.getList();
for (int i = 0; i < list.size(); i++) {
FileList.writeFile(
"file/musiclist.txt",list.get(i).getId()+","+list.get(i).getName()+","
+list.get(i).getPath()+"\n");
}

}





}



@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub

}



@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub

}



@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub

}



@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
System.out.println("open");

File file
=new File("file/musiclist.txt");

if (file.exists()==false) {
try {
file.createNewFile();
}
catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
else {


FileList.readFileByLines(
"file/musiclist.txt");
jt.setModel(
new Model());
}



}

}

 

 剩下的代码在后面附件上有,现在主要是有几个小问题,第一,我还没有找到获取音乐文件具体信息比较好的办法,所以每一首暂时还没有歌手,作曲的信息,第二界面有点难看,见谅了,第三个是打包成jar文件会有路径问题,暂时还没办法解决,我是直接在myeclipse上运行,一切正常,就是打包有点小问题

暂时先说这些了,这个是我业余时间的项目,有什么不足的,大家都可以提出来

附件下载