在java问题中使用JLayer在一个线程中只播放一个mp3文件



我在一个音频播放器工作,这是用Java编写的GUI。为了播放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文件。提前谢谢你,期待你的建议

我修复了我的问题与线程;我把解决办法放上去,也许能帮到别人。

     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,所以不能再创建线程。

在你按下播放按钮并且线程已经开始后使用此按钮,一旦播放器开始,该按钮将禁用并在歌曲完成后再次启用

    yourplaybutton.setEnabled(false);

相关内容

  • 没有找到相关文章

最新更新