Java MediaPlayer.getTotalDuration().toSeconds()在初始化方法中调用时返回NaN
我正在使用JavaFX开发MediaPlayer,以完成JavaFX课程。我正在尝试将文件总持续时间设置为slider max属性。然后我想将侦听器添加到currentTimeProperty,以便滑块跟踪时间线 我写了一个非常好的代码: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
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的一部分……事实上,我才刚刚开始学习编程,这就是为什么,尽管如此,感谢您的帮助!