您可以使用Animation API的Timeline
進行此操作。
簡言之:
public class TimelineEvent {
private final Duration time ;
private final String info ;
public TimelineEvent(Duration time, String info) {
this.time = time ;
this.info = info ;
}
public Duration getTime() {
return time ;
}
public String getInfo() {
return info ;
}
}
int maxSeconds = ... ;
TimelineEvent[] events = ... ; // populate array of events...
Slider slider = new Slider(0, maxSeconds, 0);
TextArea textArea = new TextArea();
// ...
Timeline timeline = new Timeline();
for (TimelineEvent event : events) {
timeline.getKeyFrames().add(new KeyFrame(event.getTime(),
e -> textArea.setText(event.getInfo());
}
// make slider value change with timeline:
timeline.getKeyFrames().add(new KeyFrame(Duration.ZERO,
new KeyValue(slider.valueProperty(), 0)));
timeline.getKeyFrames().add(new KeyFrame(Duration.seconds(maxSeconds),
new KeyValue(slider.valueProperty(), maxSeconds)));
timeline.play();
的替代,這可能是如果用戶是「手動」移動滑塊更方便(以及動畫的話),將是隻是使用動畫來移動滑塊,然後使用偵聽器或綁定上滑塊的值:
int maxSeconds = ... ;
Slider slider = new Slider(0, maxSeconds, 0);
TextArea textArea = new TextArea();
Timeline timeline = new Timeline(
new KeyFrame(Duration.ZERO, new KeyValue(slider.valueProperty(),0)),
new KeyFrame(Duration.seconds(maxSeconds), new KeyValue(slider.valueProperty(),maxSeconds)));
textArea.textProperty().bind(Bindings.createStringBinding(
() -> findInfoForTimepoint(slider.getValue()),
slider.valueProperty()));
與
private String findInfoForTimepoint(double seconds) {
// figure and return correct "info" for given time in seconds...
}
感謝您的建議James_D。第一個是非常優雅的地方,每個事件都設置爲一個KeyFrame,當相應的時間流逝時觸發。第二種方法也很好,但是,bind語句會在每個滑塊值更改上運行,這意味着findInfoForTimepoint()會運行很多次,這是不可取的。 所以我傾向於第一個建議。然而,我試圖修改它在播放過程中移動拇指,但由於某些原因,我不能。有沒有辦法將拇指拉回到某一點,然後繼續播放,而KeyFrame事件仍然有效? – emjay