直到最后您都看不到效果,因为您正在FX Application
Thread上执行所有操作。这是负责呈现UI的同一线程,因此,如果对该线程执行了某些操作(例如
SolveClicked[sic:请使用正确的命名约定
]方法),则在操作完成之前无法呈现UI。
如果您以正确的方式思考,那么您真正要做的就是创建动画。(您不仅要显示解决方案,还想向用户显示多个“动画帧”,每个动画帧代表解决方案中的一个步骤。)因此,您应该使用animation
API。最简单的方法可能是
Timeline:
@FXMLprotected 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();}如果您需要一种更“自动化”的方式来生成时间轴,则可以执行以下操作(有趣):
@FXMLprotected 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。



