java音乐播放器

音乐播放器

package 音乐播放器;

import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.Color;
import java.awt.Font;
import java.awt.List;
import java.awt.MenuBar;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Vector;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
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.filechooser.FileNameExtensionFilter;



public class MusicPlayer extends JFrame {
    JLabel songNameLabel = null;// 用标签显示状态
    // 四个播放功能键按钮
    JButton btnLast = null; // 上一曲
    JButton btnPlay = null; // 播放/停止
    JButton btnNext = null; // 下一曲
    JButton btnLoop = null; // 循环
    JButton btnAdd = null;// 添加

    JLabel listLabel = null;// 播放列表标签

    List songsList;// 列表

    Vector<AudioClip> songs;// 列表中的歌曲

    AudioClip currentSongs;// 当前歌曲
    // 此处用并发容器,不然会报错误
    HashSet<File> strSongsName = new HashSet<File>();

    Record record = new Record();

    String strCurrentSongName; // 当前选定播放歌曲的名称
    int index = 0; // 记录当前选定播放的歌曲的序号(当前播放的那首歌曲),默认第一首
    boolean isPlayOrStop = true;// 记录播放状态(播放/停止),默认为播放
    boolean isLoop = false; // 记录循环状态,默认为不循环播放

    Thread playerThread; // 音频播放线程
    public MusicPlayer() {
        super("音乐播放器");
        this.setLayout(null);
        this.setBounds(300, 50, 330, 500);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);


        //添加文件
        JMenuBar menuBar=new JMenuBar();
        this.setJMenuBar(menuBar);
        JMenu menu=new JMenu("文件");
        menuBar.add(menu);
        JMenuItem menuAdd=new JMenuItem("添加文件");
        menu.add(menuAdd);
        menuAdd.addActionListener(new ActionListener() {


            public void actionPerformed(ActionEvent e) {
                JFileChooser jc=new JFileChooser();
                jc.showOpenDialog(MusicPlayer.this);

            }
        });
        // 标签:我的音乐播放器/歌曲名
        songNameLabel = new JLabel();
        Font songNameFont = new Font("斜体", Font.ITALIC, 18);
        songNameLabel.setFont(songNameFont);
        songNameLabel.setText("我的音乐播放器");
        songNameLabel.setBounds(10, 10, 300, 40);
        this.getContentPane().add(songNameLabel);

        // 四个播放功能键按钮
        // 构造四个按钮
        btnLast = new JButton();
        btnPlay = new JButton();
        btnNext = new JButton();
        btnLoop = new JButton();
        // 添加歌曲
        btnAdd = new JButton();

        // 设置位置和大小
        btnLast.setBounds(10, 70, 50, 40);
        btnPlay.setBounds(70, 70, 50, 40);
        btnNext.setBounds(130, 70, 50, 40);
        btnLoop.setBounds(190, 70, 50, 40);
        btnAdd.setBounds(250, 70, 50, 40);

        // 设置图片
        btnLast.setIcon(new ImageIcon("./Image//1.png"));
        btnPlay.setIcon(new ImageIcon("./Image//2.png"));
        btnNext.setIcon(new ImageIcon("./Image//3.png"));
        btnLoop.setIcon(new ImageIcon("./Image//4.png"));
        btnAdd.setIcon(new ImageIcon("./Image//添加.png"));

        // 给按钮添加监听
        MouseListener mlc = new MouseListenerC();// 鼠标监听器对象
        btnLast.addMouseListener(mlc);
        btnPlay.addMouseListener(mlc);
        btnNext.addMouseListener(mlc);
        btnLoop.addMouseListener(mlc);
        btnAdd.addMouseListener(mlc);
        // 添加到框架
        getContentPane().add(btnLast);
        getContentPane().add(btnPlay);
        getContentPane().add(btnNext);
        getContentPane().add(btnLoop);
        getContentPane().add(btnAdd);

        // 以下这段设置歌曲播放列表
        // 设置播放列表的标签
        listLabel = new JLabel("播放列表");
        listLabel.setBounds(10, 120, 100, 30);
        Font listLabelFont = new Font("宋体", Font.BOLD, 15);
        listLabel.setFont(listLabelFont);
        this.getContentPane().add(listLabel);

        // 设置播放列表控件
        songsList = new List();
        songsList.setFont(new Font("斜体", Font.ITALIC, 20));
        songsList.setBounds(10, 150, 250, 300);
        songsList.setBackground(Color.cyan);
        songs = new Vector<AudioClip>();

        // 添加歌曲线程运行
        // add();

        // 读取歌曲列表
        try {
            record.read();
            Iterator<File> it=strSongsName.iterator();
            while(it.hasNext()){
                File file=it.next();
                add(file.getAbsolutePath());
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        songsList.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                currentSongs.stop();
                index = songsList.getSelectedIndex();
                playerThread = new Thread(new MusicRun());
                playerThread.start();
            }
        });
        playerThread = new Thread(new MusicRun());
        playerThread.start();
        this.getContentPane().add(songsList);
        this.setVisible(true);

    }
    class MusicRun implements Runnable{

        public void run() {
            currentSongs = songs.get(index);
            if (isLoop) {
                currentSongs.loop();
            }
            strCurrentSongName =songsList.getItem(index);
            songNameLabel.setText("正在播放:" + strCurrentSongName);
            songsList.select(index);// 在播放列表中选定当前播放歌曲条目
            btnPlay.setIcon(new ImageIcon("./Image//5.png"));// 切换成“停止”图标
            if (isPlayOrStop) {
                currentSongs.play();
            }
        }

    }

    private void add(String str) {
        // 把歌曲文件名加载进来
        songsList.add(new File(str).getName());
        songs.add(loadSound(str));

    }

    // 记录
    class Record {
        private FileWriter fw;
        private FileReader fr;
        private File file;
        private BufferedReader bufr;
        private BufferedWriter bufw;

        public Record() {
            try {
                file = new File("H://Music.txt");
                if (!file.exists()) {
                    file.createNewFile();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        // 存储
        public void Save(String str) {
            try {

                fw = new FileWriter(file, true);
                bufw = new BufferedWriter(fw);
                bufw.write(str + "\r\n");
            } catch (IOException e) {

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

                    }
                }
                if (fw != null) {
                    try {
                        fw.close();
                    } catch (IOException e) {

                    }
                }

            }
        }

        // 读取文件信息
        public void read() throws FileNotFoundException {
            try {
                fr = new FileReader(file);
                bufr = new BufferedReader(fr);
                String str;
                while ((str = bufr.readLine()) != null) {
                    strSongsName.add(new File(str));
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

    class MouseListenerC extends MouseAdapter {

        @Override
        public void mouseClicked(MouseEvent e) {
            JButton btn = (JButton) e.getSource();
            if (btn == btnAdd) {
                JFileChooser chooser = new JFileChooser();
                FileNameExtensionFilter filter = new FileNameExtensionFilter(
                        "*.wav", "wav");
                chooser.setFileFilter(filter);
                int returnVal = chooser.showOpenDialog(MusicPlayer.this);
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    boolean flag = strSongsName.add(chooser.getSelectedFile());
                    // 添加歌曲线程运行
                    if (flag) {
                        record.Save(chooser.getSelectedFile().getAbsolutePath());
                        add(chooser.getSelectedFile().getAbsolutePath());
                    }else{
                        JOptionPane.showMessageDialog(null,"已存在相同歌曲  添加失败");
                    }
                }

            }
            currentSongs.stop();
            if (btn == btnPlay) {
                isPlayOrStop = !isPlayOrStop;
            } else if (btn == btnLast) {
                index--;
                if (index < 0) {
                    index = strSongsName.size()- 1;
                }
                isPlayOrStop = true;
                isLoop = false;
            } else if (btn == btnNext) {
                index++;
                index = index % strSongsName.size();
                isPlayOrStop = true;
                isLoop = false;
            } else if (btn == btnLoop) {
                isLoop = !isLoop;
            }

            if (isPlayOrStop) {
                playerThread = new Thread(new MusicRun());
                playerThread.run();
            } else {
                songNameLabel.setText("停止播放:" + strCurrentSongName);
                btnPlay.setIcon(new ImageIcon("./Image//2.png"));
            }

        }

    }

    public static void main(String[] args) {
        MusicPlayer mp = new MusicPlayer();
    }

    public AudioClip loadSound(String filename) {
        URL url = null;
        try {
            url = new URL("file:" + filename);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        return Applet.newAudioClip(url);
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值