[英]Music Player reading from text file plays all pieces at once Javafx
您好,我目前正在尝试向应用程序添加音乐,现在我正在让程序从文件中获取文件名并进行播放。 由于该应用程序中的一个缺陷,我尝试通过使线程进入睡眠状态进行调解,因此音乐播放器同时播放两个片段,虽然听起来不错,但对我没有帮助。 下面是我的代码:
public static class MusicPlayerService extends Service<Void>
{
public static File[] musicArray = new File[2];
public static int fileNumber = 0;
@Override
protected Task<Void> createTask(){
Scanner musicListReader;
try {
musicListReader = new Scanner(new File("Music_PlayList.txt"));
while(musicListReader.hasNext())
{
musicArray[fileNumber] = new File(musicListReader.next());
String uriString = musicArray[fileNumber].toURI().toString();
Media media = new Media(uriString);
MediaPlayer player = new MediaPlayer(media);
player.play();
Thread.sleep((long) media.getDuration().toMillis());
fileNumber++;
}
} catch (FileNotFoundException | InterruptedException e1) {
e1.printStackTrace();
}
return null;
}
}
可以考虑使用事件驱动的方法来代替循环和休眠的方法。 您可以在媒体播放器上注册onStopped
处理程序,然后从那里开始下一首歌曲(如果有下一首歌曲)。 这样,您也不需要使用后台线程。
就像是:
Queue<File> musicList = new LinkedList<File>();
try (Scanner musicListReader = new Scanner(new File("Music_PlayList.txt"))) {
while (musicListReader.hasNext()) {
musicList.add(new File(musicListReader.next()));
}
} catch (Exception e) {
e.printStackTrace();
}
playNextMusicFile(musicList);
// ...
private void playNextMusicFile(Queue<File> musicList) {
if (musicList.isEmpty()) {
return ;
}
Media media = new Media(musicList.remove().toURI().toString());
MediaPlayer player = new MediaPlayer(media);
player.setOnEndOfMedia(() -> {
player.dispose();
playNextMusicFile(musicList);
});
player.play();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.