Java游戏练习---音乐播放器

大概是这个样子的
这里写图片描述
代码如下

package cn.hncu.games;

import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.net.URL;

import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.ListModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class MusicPlayer extends JFrame{
    //显示(歌曲名称)播放状态的标签
    JLabel songNameLabel = null;

    //四个播放功能键按钮
    JButton btnLast = null; //上一曲
    JButton btnPlay = null; //播放/停止
    JButton btnNext = null; //下一曲
    JButton btnLoop = null; //循环

    //歌曲列表
    JList songsList = null;
    AudioClip songs[] = null;
    AudioClip currentSong = null;
    int index=0; //当前歌曲在JList中的位置(序号)
    //歌曲文件名数组---String
    String[] strSongNames={ "song1.wav","song2.wav","song3.wav","song4.wav","song5.wav","song6.wav" };
    final String DIR="songs\\";

    //播放音乐的线程
    Thread playerThread=null;
    boolean isPlayOrStop = true;//true代表播放状态
    boolean isLoop = false; //是否为循环状态

    public MusicPlayer() {
        super("音乐播放器");
        setBounds(300, 50, 310, 500);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(null);
        //hello();

        //显示(歌曲名称)播放状态的标签
        songNameLabel = new JLabel();
        Font songNameFont = new Font("黑体",Font.ITALIC,18);
        songNameLabel.setFont(songNameFont);
        songNameLabel.setText("我的音乐播放器");
        songNameLabel.setBounds(10, 10, 300, 40);
        getContentPane().add(songNameLabel);

        //四个播放功能键按钮
        btnLast = new JButton();
        btnPlay = new JButton();
        btnNext = new JButton();
        btnLoop = 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);
        //设置图片
        btnLast.setIcon( new ImageIcon("images2/1.png"));
        btnPlay.setIcon( new ImageIcon("images2/2.png"));
        btnNext.setIcon( new ImageIcon("images2/3.png"));
        btnLoop.setIcon( new ImageIcon("images2/4.png"));
        //添加到框架
        getContentPane().add(btnLast);
        getContentPane().add(btnPlay);
        getContentPane().add(btnNext);
        getContentPane().add(btnLoop);
        //添加监听
        MyMouseListener mml = new MyMouseListener();
        btnLast.addMouseListener(mml);
        btnPlay.addMouseListener(mml);
        btnNext.addMouseListener(mml);
        btnLoop.addMouseListener(mml);


        //歌曲列表的标题
        JLabel listLabel = new JLabel("播放列表");
        listLabel.setBounds(10, 120, 100, 30);
        Font listLabelFont = new Font("黑体",Font.BOLD,16);
        listLabel.setFont(listLabelFont);
        getContentPane().add(listLabel);

        //歌曲列表
        /*
        songsList = new JList();
        songsList.setBounds(10, 150, 250, 300);
        songsList.setBackground(Color.CYAN);
        //把所有歌曲名逐个添加到List中
        //songsList.setListData(strSongNames);
        for(int i=0;i<strSongNames.length;i++){
            DefaultListModel dm = (DefaultListModel)songsList.getModel();
            dm.add(i,strSongNames[i]);
        }
        getContentPane().add(songsList);
        */

        DefaultListModel lm = new DefaultListModel();
        songsList = new JList(lm);
        songsList.setBounds(10, 150, 250, 300);
        songsList.setBackground(Color.CYAN);
        //把所有歌曲名逐个添加到List中
        //songsList.setListData(strSongNames);
        songs = new AudioClip[strSongNames.length];
        for(int i=0;i<strSongNames.length;i++){
            lm.add(i,strSongNames[i]);
            songs[i] = loadSound(strSongNames[i]);
        }
        getContentPane().add(songsList);
        //lm.remove(3);

        //对JList控件的监听技术实现
        songsList.addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                currentSong.stop();
                index = songsList.getSelectedIndex();
                isPlayOrStop = true;
                playerThread = new Thread( new MusicRun() );
                playerThread.start();
            }
        });


        //单开一个线程,专用于播放音乐
        playerThread = new Thread( new MusicRun() );
        playerThread.start();


        setVisible(true);
    }



    private AudioClip loadSound(String fileName) {
        try {
            URL url = new URL("file:songs\\"+fileName);
            AudioClip au = Applet.newAudioClip(url);
            return au;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    //讲解音乐播放的基本技术
    private void hello() {
        try {
            File f = new File("songs\\song1.wav");
            URL url = f.toURI().toURL();
            //URL url = new URL("file:songs\\song1.wav");
            AudioClip au = Applet.newAudioClip(url);
            au.play();
            //au.loop();
            //au.stop();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private class MyMouseListener extends MouseAdapter{
        @Override
        public void mouseClicked(MouseEvent e) {
            JButton btn = (JButton) e.getSource();
            currentSong.stop();
            if(btn==btnPlay){
                isPlayOrStop = !isPlayOrStop;
            }else if(btn==btnLast){
                index--;
                if(index<0){
                    index = strSongNames.length-1;
                }
                //isPlayOrStop=true;
            }else if(btn==btnNext){
                index++;
                index = index%strSongNames.length;

            }else if(btn==btnLoop){
                isLoop = !isLoop;
            }

            if(isPlayOrStop){//播放
                playerThread = new Thread( new MusicRun() );
                playerThread.start();
            }else{//停止
                songsList.setSelectedIndex(index);
                songNameLabel.setText("停止播放:"+strSongNames[index]);
                btnPlay.setIcon( new ImageIcon("images2/2.png"));
            }
        }
    }

    private class MusicRun implements Runnable{
        @Override
        public void run() {
            currentSong = songs[index];
            if(isLoop){
                currentSong.loop();
                songNameLabel.setText("循环播放:"+strSongNames[index]);
            }
            if (isPlayOrStop) {
                currentSong.play();
            }
            //在播放列表中选定当前歌曲
            songsList.setSelectedIndex(index);
            //把播放按钮的图标切换成“停止”
            btnPlay.setIcon( new ImageIcon("images2/5.png"));

            if(!isLoop){
                songNameLabel.setText("正在播放:"+strSongNames[index]);
            }
        }
    }


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

}
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值