Слушатель событий получает возможность изменить значение слайдера JavaFX - PullRequest
0 голосов
/ 27 января 2020

Я делаю слайдер, который перемещается при воспроизведении песни, используя класс MediaPlayer из JavaFX. Это работает совершенно нормально, и слайдер движется вместе с песней. Если слайдер перетаскивается, он меняет местоположение песни (используя метод .seek ()). Единственная проблема возникает, когда я нажимаю ползунок. Песня не двигается, и я думаю, что это потому, что слушатель, смотрящий на позицию песни, все еще движется, и это перемещает ползунок в его следующую позицию. Я думаю, что это блокирует клик пользователя, но я не уверен, как это исправить. Будет ли это означать приостановку слушателя или что-то, в чем я не уверен?

protected void updateValues() {
            if (playTime != null && progressBar != null && volume != null) {
               Platform.runLater(new Runnable() {
                  public void run() {
                    Duration currentTime = player.getCurrentTime();
                    duration = player.getMedia().getDuration();
                    playTime.setText(formatTime(currentTime, duration));
                    progressBar.setDisable(duration.isUnknown());
                    if (!progressBar.isDisabled() 
                      && duration.greaterThan(Duration.ZERO) 
                      && !progressBar.isValueChanging()) {
                        progressBar.setValue(currentTime.divide(duration).toMillis()
                            * 100.0);
                    }
                  }
               });
            }
    }

progressBar.setOnMouseReleased(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            player.seek(duration.multiply(progressBar.getValue()/100.0));
        }
});

Если это полезно, я следую этому: https://docs.oracle.com/javafx/2/media/playercontrol.htm

1 Ответ

0 голосов
/ 27 января 2020

Я подозреваю, что вам нужно добавить setOnMouseClicked , чтобы вызвать событие по щелчку мыши,

progressBar.setOnMouseClicked(e -> 
    player.seek(duration.multiply(progressBar.getValue()/100.0))
);

Если вы хотите go с мышью-событием, чтобы оба В некоторых случаях вам может потребоваться добавить два обработчика событий мыши setOnMouseReleased (для перетаскивания и отпускания ползунка) и setOnMouseClicked (для нажатия ползунка). Но я предлагаю вам добавить ChangeListener к ползунку вместо установки прослушивателей событий мыши.

progressBar.valueProperty().addListener((observable, oldValue, newValue) ->
    player.seek(duration.multiply(newValue.doubleValue()/100.0))
);
...