gpt4 book ai didi

java - 从文本文件读取的音乐播放器会同时播放所有片段 Javafx

转载 作者:行者123 更新时间:2023-12-01 09:25:01 26 4
gpt4 key购买 nike

您好,我目前正在尝试将音乐添加到我的应用程序中,现在我正在让程序从文件中获取文件名并播放它们。由于应用程序中存在缺陷,我尝试通过使线程 hibernate 来进行调解,音乐播放器同时播放两首曲子,虽然听起来不错,但对我没有帮助。下面是我的代码:

    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;
}
}

最佳答案

考虑使用事件驱动方法,而不是循环和 sleep 方法。您可以向媒体播放器注册一个 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();
}

关于java - 从文本文件读取的音乐播放器会同时播放所有片段 Javafx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39907785/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com