java - 如何在 JavaFX 中继续循环之前等待媒体结束?

标签 java javafx

我有一个 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/

相关文章:

java - 使用 PowerMock 在 JUnit Suite 中共享静态初始化

java - 改变方向 5 次后内存不足

java - 如何设置/获取二维数组列表中的值?

java - 如何将 HBox 中的子元素左对齐、居中对齐和右对齐

css - 更改属性 jfx 装饰器

javafx - 如果超限,调整 JavaFX 标签的大小

java - 图形组件

java - 是否可以将 x86 32 位汇编代码转换为等效的 JVM 字节码并执行它?

JavaFX:未装饰的窗口

java - FXML 对象在使用前被删除