如何用javaFX播放多个连续的声音文件?

How to play multiple consecutive sound files with javaFX?

我想使用 javaFX 依次播放 5 个声音文件。我很难连续玩两个以上。此代码只播放前两个声音文件,然后不播放第三个。我希望能够播放最多 5 个声音文件,但没有限制是最理想的。任何帮助表示赞赏。谢谢! 我正在尝试制作一个会说话的时钟来告诉你时间,但我卡在了你让它说话的部分。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.stage.Stage;

public class MediaFX extends Application{


    MediaPlayer mediaplayer; 

    public static void main(String[] args){
        launch(args);
    }

    @Override
    public void start(Stage stage){
        Media hello = new Media("file:///C:/Users/Good/Desktop/TimeFiles/one.wav");
        Media meow = new Media("file:///C:/Users/Good/Desktop/TimeFiles/oh.wav");
        Media neww = new Media("file:///C:/Users/Good/Desktop/TimeFiles/six.wav");

        mediaplayer = new MediaPlayer(hello);
        mediaplayer.play();
        mediaplayer.setOnEndOfMedia(new Runnable(){
            @Override
            public void run(){
                mediaplayer.stop();
                mediaplayer = new MediaPlayer(meow);
                mediaplayer.setAutoPlay(false);
                mediaplayer.play();
            }
        });
        mediaplayer.setOnEndOfMedia(new Runnable(){
            @Override
            public void run(){
                mediaplayer.stop();
                mediaplayer = new MediaPlayer(neww);
                mediaplayer.setAutoPlay(false);
                mediaplayer.play();
            }
        });

        VBox root = new VBox();
        root.getChildren().addAll();

        Scene scene = new Scene(root,500,500);
        stage.setScene(scene);
        stage.show();
    }

}

您必须找到一种方法来创建某些动作的循环,以便能够实现您想要的。您需要:

  1. 查找是否还有可播放的歌曲
  2. 新建MediaPlayer实例并设置下一首歌曲
  3. 设置在当前歌曲结束后再次检查是否有新歌曲。
  4. 转到第 1 个

一个很好的方法是递归调用初始化函数,如下所示:

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.stage.Stage;

public class MediaFX extends Application {

    MediaPlayer mediaplayer;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) {
        Media hello = new Media(this.getClass().getResource("one.wav").toExternalForm());
        Media meow = new Media(this.getClass().getResource("two.wav").toExternalForm());
        Media neww = new Media(this.getClass().getResource("three.wav").toExternalForm());

        ObservableList<Media> mediaList = FXCollections.observableArrayList();
        mediaList.addAll(hello, meow, neww);

        playMediaTracks(mediaList);

        VBox root = new VBox();

        stage.setScene(new Scene(root,300,300));
        stage.show();
    }

    private void playMediaTracks(ObservableList<Media> mediaList) {
        if (mediaList.size() == 0)
            return;

        MediaPlayer mediaplayer = new MediaPlayer(mediaList.remove(0));
        mediaplayer.play();

        mediaplayer.setOnEndOfMedia(new Runnable() {
            @Override
            public void run() {
                playMediaTracks(mediaList);
            }
        });
    }

}