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

我正在使用带有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); } } } } }); } 

我提到我是multithreading的新手,所以对我来说不是那么难。 如果我不能用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);