MediaPlayer.getTotalDuration().toSeconds() returns 在 Initialize 方法中调用时为 NaN

MediaPlayer.getTotalDuration().toSeconds() returns NaN when called in Initialize method

我正在使用 JavaFX 研究 MediaPlayer,以完成 javaFX 课程。我正在尝试将文件总持续时间设置为滑块最大值 属性。然后我想将 Listener 添加到 currentTimeProperty,以便滑块跟踪时间线。

我编写了一个运行良好的代码:

timeSlider.setMax(mediaPlayerMain.getTotalDuration().toSeconds());
System.out.println("Max value: " + mediaPlayerMain.getTotalDuration().toSeconds());
mediaPlayerMain.currentTimeProperty().addListener(new ChangeListener() {

    @Override
    public void changed(ObservableValue o, Object oldVal, Object newVal) {
        timeSlider.setValue(mediaPlayerMain.getCurrentTime().toSeconds());
    }
    
});

当我在视频已经播放后调用它时它会起作用。问题是我想在 MediaView 准备好后调用它,以便滑块从一开始就自动工作。如果我把它放在 mediaPlayerMain.getTotalDuration().toSeconds() returns NaN 的初始化方法中,那么根据 Duration API.

,周期必须是 UNKNOWN

如何等待 mediaPlayer 对象就绪以便滑块正常工作? 感谢任何帮助,提前致谢!

不像

@FXML
private Slider timeSlider ;

@FXML
private MediaPlayer mediaPlayerMain ;

@FXML
private void initialize() {
    if (mediaPlayerMain.getStatus() == MediaPlayer.Status.UNKNOWN) {
        mediaPlayerMain.statusProperty().addListener((obs, oldStatus, newStatus) -> {
            if (newStatus == MediaPlayer.Status.READY) {
                initializeSlider();
            } 
        });
    } else {
        initializeSlider();
    }
}

private void initializeSlider() {
    timeSlider.setMax(mediaPlayerMain.getTotalDuration().toSeconds());
    mediaPlayerMain.currentTimeProperty().addListener((obs, oldTime, newTime) -> 
        timeSlider.setValue(newTime.toSeconds()));
}

工作?