【问题标题】:MediaPlayer.getTotalDuration().toSeconds() returns NaN when called in Initialize methodMediaPlayer.getTotalDuration().toSeconds() 在 Initialize 方法中调用时返回 NaN
【发布时间】:2021-05-20 20:45:49
【问题描述】:

我正在使用 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() 会返回 NaN,因此根据 Duration API,周期必须是 UNKNOWN。

如何等待 mediaPlayer 对象准备好让滑块工作? 任何帮助表示赞赏,在此先感谢!

【问题讨论】:

  • 为什么不直接用媒体播放器的状态注册一个监听器,并在滑块变为READY时设置滑块的最大值?这必须在当前时间更改之前发生。

标签: java javafx slider media-player duration


【解决方案1】:

不喜欢

@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 有一个 link
  • @KubaWoźny Lambda 表达式自 2014 年以来一直是 Java 的一部分...
  • 其实我才刚开始学编程,所以还是谢谢大家帮忙!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
相关资源
最近更新 更多