我在一个音频播放器工作,这是用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);