我有一个 Arraylist
path
包含不同 .mp3 文件的路径。我当前的解决方案按预期播放剪辑,但同时播放它们。我希望媒体在到达循环末尾并增加 i
之前完成播放。我已经谷歌并探索了类似的问题在这里,但没有一个解决方案似乎按预期工作。请参阅下面的当前解决方案:
public static void play(ArrayList path) {
for(int i = 0; i < path.size(); i++) {
String file = Main.gameDir + "/assets/sound/" + path.get(i) + ".mp3";
Media sound = new Media(new File(file).toURI().toString());
MediaPlayer mediaPlayer = new MediaPlayer(sound);
mediaPlayer.play();
}
}
我尝试获取状态,但始终返回 UNKNOWN
。
感谢所有和任何帮助。
最佳答案
正如您所发现的,MediaPlayer#Play(Media)
同时播放声音。您想要实现的是,如果当前声音已结束,则播放另一种声音。您可以通过 MediaPlayer#setOnEndOfMedia(Runnable)
注册事件处理程序来实现此目的。在事件监听器中,您可以获取下一个声音并播放它,例如这样:
public static void play(List<String> paths) {
LinkedList<Media> sounds = paths.stream().serial()
.map(path -> Main.gameDir + "/assets/sound/" + path + ".mp3")
.map(file -> new Media(new File(file).toURI().toString()))
.collect(Collectors.toList(LinkedList::new));
[ThisClass].play(sounds);
}
public static void play(LinkedList<Media> sounds) {
if (sounds.isEmpty())
return;
MediaPlayer player = new MediaPlayer(sounds.poll());
player.setOnEndOfMedia(() -> [ThisClass].play(sounds));
player.play();
}
您需要将[ThisClass]
替换为您自己的类名。我还冒昧地向您提供的列表添加了一个通用参数,并使其不那么具体(不需要 ArrayList,列表就足够了),并用流替换了您的显式循环。
关于java - 如何在 JavaFX 中继续循环之前等待媒体结束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62417338/