JavaFXのビデオプログレスバーの実装
プロジェクトにこの記事のコード参照https://github.com/Al-assad/Simple-Media-Player
まず、我々は、プログレスバーとビデオの時間を表現するためのラベルがあることを前提とし
@FXML
Slider processSD;
@FXML
Label timeLB;
プレイヤーが作成したときに我々は最初のリスナーを登録する必要があります。
mediaPlayer.currentTimeProperty().addListener(new ChangeListener<Duration>() {
@Override
public void changed(ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) {
updateTime();
}
});}
このリスナーは、システムが呼び出されるたびに変化します
private String formatTime(Duration elapsed, Duration duration) {
//将两个Duartion参数转化为 hh:mm:ss的形式后输出
int intElapsed = (int) Math.floor(elapsed.toSeconds());
int elapsedHours = intElapsed / (60 * 60);
int elapsedMinutes = (intElapsed - elapsedHours * 60 * 60) / 60;
int elapsedSeconds = intElapsed - elapsedHours * 60 * 60 - elapsedMinutes * 60;
if (duration.greaterThan(Duration.ZERO)) {
int intDuration = (int) Math.floor(duration.toSeconds());
int durationHours = intDuration / (60 * 60);
int durationMinutes = (intDuration - durationHours * 60 * 60) / 60;
int durationSeconds = intDuration - durationHours * 60 * 60 - durationMinutes * 60;
if (durationHours > 0) {
return String.format("%02d:%02d:%02d / %02d:%02d:%02d", elapsedHours, elapsedMinutes, elapsedSeconds, durationHours, durationMinutes, durationSeconds);
} else {
return String.format("%02d:%02d / %02d:%02d", elapsedMinutes, elapsedSeconds, durationMinutes, durationSeconds);
}
} else {
if (elapsedHours > 0) {
return String.format("%02d:%02d:%02d / %02d:%02d:%02d", elapsedHours, elapsedMinutes, elapsedSeconds);
} else {
return String.format("%02d:%02d / %02d:%02d", elapsedMinutes, elapsedSeconds);
}
}
}
public void updateTime() {
if (processSD != null && timeLB != null && volumeSD != null && volumeBT != null) {
Platform.runLater(new Runnable() {
@Override
public void run() {
Duration currentTime = mediaPlayer.getCurrentTime();
timeLB.setText(formatTime(currentTime, duration)); //设置时间标签
processSD.setDisable(duration.isUnknown()); //无法读取时间是隐藏进度条
if (!processSD.isDisabled() && duration.greaterThan(Duration.ZERO) && !processSD.isValueChanging()) {
processSD.setValue(currentTime.toMillis() / duration.toMillis() * 100); //设置进度条
}
}
});
}
}
これは、コントロールを更新しています
ここで使用Platform.runLater、それは何ですか?
出典ます。https://blog.csdn.net/u010061897/article/details/69358246
あなたはFxのFxは非スレッドスレッドに関連するタスクを実行する場合は、JavaFXの中でPlatform.runlaterで実行しなければならない、
とrunlaterコードは、現在のスレッドをブロックしません。
言い換えれば、Platform.runLaterコードは、実行の別のスレッドを開始します。それがコントロールを更新するために呼び出すことは非常に頻繁にあるので、それを再生避けるために、マルチスレッドを使用すると、ビデオのメインスレッドに影響を与えます