0

我正在使用带有 GUI 的 Java 编写的音频播放器。为了播放 mp3 文件,我选择了 javazoom 的 JLayer 库,因为我看到它非常流行和使用。我制作了 GUI,设法从播放列表中播放选定的 mp3 文件。

我的问题是,如果我多次按下播放按钮或播放列表中的文件,它将开始播放歌曲的次数与我按下它的次数一样多,我想在同一个线程中播放它;如果我再次按下播放按钮,我想再次播放而不是在播放当前歌曲时开始播放同一首歌曲。

这是我播放 mp3 文件的代码:

    public class Playing implements Runnable{

        private Player mp3Player;
        private Thread playerThread;

        public void createPlayer(FileInputStream file) throws JavaLayerException{

            mp3Player = new Player(file);

            playerThread = new Thread(this);
            playerThread.start();
    }

   @Override
   public void run(){

        try {

            mp3Player.play();
        } 
        catch (JavaLayerException ex) {

            Logger.getLogger(Playing.class.getName()).log(Level.SEVERE, null, ex);
        }
   }

这是我的播放按钮方法:

    public void createPlayButton(){

        play = new JButton();
        playButton = new ImageIcon("D:/Audio Player/Images/playButton.png");
        play.setBounds(125, 100, 50, 50);
        play.setIcon(playButton);
        play.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {

            for (int i = 0; i < select.getFilesPath().size(); i++){

                if (select.getFilesPath().get(i).toString().contains(playlistBody.getSongName())){

                    try {
                        mp3Player.createPlayer(new FileInputStream(new File(select.getFilesPath().get(i).toString())));
                    } catch (JavaLayerException ex) {
                        Logger.getLogger(PlayerBody.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (FileNotFoundException ex) {
                        Logger.getLogger(PlayerBody.class.getName()).log(Level.SEVERE, null, ex);
                    }

                }
            }

        }
    });
}

我提到我是多线程的新手,所以不要对我这么苛刻。如果我不能用 JLayer 做到这一点,请向我推荐一个可以播放 mp3 文件的好库。提前感谢您,我正在等待您的建议。

4

2 回答 2

0

我用线程解决了我的问题;我会提出解决方案,也许会帮助某人。

     static int fileRunning = 0;

     public void playMp3(FileInputStream file) throws JavaLayerException{

         if (fileRunning == 0){

             mp3Player = new Player(file);

             playerThread = new Thread(this);
             playerThread.start();

             fileRunning = 1;

         }
     }

所以主要的想法是,当我开始播放歌曲时,int 将取值为 1,并且不会为 0,因此无法创建更多线程。

于 2013-03-21T13:52:22.083 回答
0

按下播放按钮后使用此功能,一旦播放器启动,线程已启动,该按钮将禁用,并在歌曲完成后再次启用

    yourplaybutton.setEnabled(false);
于 2013-04-27T16:24:47.610 回答