直到最后您都看不到效果,因为您正在FX Application Thread上执行所有操作。这是负责呈现UI的同一线程,因此,如果对该线程执行了某些操作(例如SolveClicked
[sic:请使用正确的命名约定 ]方法),则在操作完成之前无法呈现UI。
如果您以正确的方式思考,那么您真正要做的就是创建动画。(您不仅要显示解决方案,还想向用户显示多个“动画帧”,每个动画帧代表解决方案中的一个步骤。)因此,您应该使用animation API。最简单的方法可能是Timeline
:
@FXML
protected void solveClicked(ActionEvent event) {
Timeline timeline = new Timeline(
new KeyFrame(Duration.millis(500), e -> L()),
new KeyFrame(Duration.millis(1000), e -> R()),
new KeyFrame(Duration.millis(1500), e -> F()),
new KeyFrame(Duration.millis(2000), e -> B()));
timeline.play();
}
如果您需要一种更“自动化”的方式来生成时间轴,则可以执行以下操作(有趣):
@FXML
protected void solveClicked(ActionEvent event) {
Runnable[] steps = new Runnable[] {this::L, this::R, this::F, this::B};
createTimeline(steps, 500).play();
}
private Timeline createTimeline(Runnable[] steps, int delay) {
Duration frameTime = Duration.millis(delay);
Duration increment = Duration.millis(delay);
Timeline timeline = new Timeline() ;
for (Runnable step : steps) {
timeline.getKeyFrames().add(new KeyFrame(frameTime, e -> step.run()));
frameTime = frameTime.add(increment);
}
return timeline ;
}
一种更复杂的方法可能是通过动画(显示实际旋转)来表示一张脸的每一个动作,然后将它们全部组合成一个SequentialTransition
。