java音乐播放器实现代码
作者:laijiawei
这篇文章主要介绍了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上运行,一切正常,就是打包有点小问题
暂时先说这些了,这个是我业余时间的项目,有什么不足的,大家都可以提出来。
下载地址:音乐播放器
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。