Java MediaPlayer.getTotalDuration().toSeconds()在初始化方法中调用时返回NaN

Java MediaPlayer.getTotalDuration().toSeconds()在初始化方法中调用时返回NaN,java,javafx,slider,media-player,duration,Java,Javafx,Slider,Media Player,Duration,我正在使用JavaFX开发MediaPlayer,以完成JavaFX课程。我正在尝试将文件总持续时间设置为slider max属性。然后我想将侦听器添加到currentTimeProperty,以便滑块跟踪时间线 我写了一个非常好的代码: timeSlider.setMax(mediaPlayerMain.getTotalDuration().toSeconds()); System.out.println("Max value: " + mediaPlayerMain.ge

我正在使用JavaFX开发MediaPlayer,以完成JavaFX课程。我正在尝试将文件总持续时间设置为slider max属性。然后我想将侦听器添加到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就绪后调用它,以便滑块从一开始就自动工作。如果我把它放在initialize方法中,
mediaPlayerMain.getTotalDuration().toSeconds()
返回NaN,因此根据Duration API,周期必须是未知的

如何等待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()));
}

工作?

为什么不直接用媒体播放器的状态注册一个侦听器,并在滑块变为
就绪时设置滑块的最大值?这必须在当前时间改变之前发生。谢谢,它成功了!虽然我在Javascript和Java中见过它,但我从未使用过“->”。如果有人发现它也是新的,那么这个表达式的api也有一个新的定义。@KubaWoźny Lambda表达式自2014年以来一直是Java的一部分……事实上,我才刚刚开始学习编程,这就是为什么,尽管如此,感谢您的帮助!