Oracle 提供了一个关于为 JavaFX 创建视频播放器控件的精彩教程。
您可以在JavaFX Ensemble应用程序中看到正在运行的教程播放器。
本教程包含有关合并播放器时间线的信息。
这是来自 Ensemble 的带有时间轴的 JavaFX 视频播放器控件的屏幕截图。
![javafx媒体播放器](https://i.stack.imgur.com/yMQXd.png)
创建一个滑块来控制MediaView位置的步骤是:
- 创建
MediaView
和它的关联MediaPlayer
。
- 创建一个
Slider
来控制时间。
- 侦听对 的更改
Slider
并根据需要更新MediaPlayer
位置。
- 监听
MediaPlayer
当前时间的变化,并Slider
酌情更新。
示例中的某些时间滑块特定代码片段是:
// Media player
MediaPlayer mp = new MediaPlayer(new Media(MEDIA_URL));
// Time label
Label timeLabel = new Label("Time: ");
timeLabel.setMinWidth(Control.USE_PREF_SIZE);
mediaBar.getChildren().add(timeLabel);
// Time slider
timeSlider = new Slider();
HBox.setHgrow(timeSlider, Priority.ALWAYS);
timeSlider.setMinWidth(50);
timeSlider.setMaxWidth(Double.MAX_VALUE);
timeSlider.valueProperty().addListener(new InvalidationListener() {
public void invalidated(Observable ov) {
if (timeSlider.isValueChanging()) {
// multiply duration by percentage calculated by slider position
if(duration!=null) {
mp.seek(duration.multiply(timeSlider.getValue() / 100.0));
}
updateValues();
}
}
});
....
protected void updateValues() {
if (playTime != null && timeSlider != null && volumeSlider != null && duration != null) {
Platform.runLater(new Runnable() {
public void run() {
Duration currentTime = mp.getCurrentTime();
playTime.setText(formatTime(currentTime, duration));
timeSlider.setDisable(duration.isUnknown());
if (!timeSlider.isDisabled() && duration.greaterThan(Duration.ZERO) && !timeSlider.isValueChanging()) {
timeSlider.setValue(currentTime.divide(duration).toMillis() * 100.0);
}
if (!volumeSlider.isValueChanging()) {
volumeSlider.setValue((int) Math.round(mp.getVolume() * 100));
}
}
});
}
}
...
mp.currentTimeProperty().addListener(new ChangeListener<Duration>() {
@Override
public void changed(ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) {
updateValues();
}
});
// and also invoke updateValues when the MediaPlayer is played, paused, etc.