对于初学者来说,这种代码经常出现的问题是在应用程序线程上执行sleep
或其他长时间运行的操作来制作动画。但是,阻塞javafx应用程序线程会导致场景无法更新,从而导致gui冻结。
您要么需要将此动画的长时间运行部分移至后台线程,并使用Platform.runLater
进行任何GUI更新,要么使用专门用于此目的的东西。 javafx.animation
包中可能有多个有用的类,但最方便的似乎是Timeline
:
将运动顺序存储在合适的数据结构中,并使用Timeline
定期触发事件处理程序以更新gui:
List<FieldIndices> fieldIndices = ...
final Iterator<FieldIndices> iterator = fieldIndices.iterator();
final Timeline timeline = new Timeline();
timeline.getKeyFrames().add(new KeyFrame(Duration.seconds(1),evt -> {
if (iterator.hasNext()) {
moveButterfly(iterator.next());
} else {
removeButterfly();
timeline.stop();
}
}));
timeline.setCycleCount(Animation.INDEFINITE); // repeat until stop is called
timeline.play();
现在剩下要做的就是将数据读取到列表中,并实现将蝶形移到新位置的逻辑。
请注意,实际上我不建议使用两个以上的场景:用户期望按钮和显示蝴蝶的“字段”处于相同位置。如果设计2个fxml,则对一个场景的任何调整都将要求您对另一个场景进行相同的调整。这使布局难以维护。另一种选择是您需要用Java代码创建场景,但是场景的重复性使得无论如何这都是一个好主意。 (另一种方法是将16个字段注入控制器,并将它们收集到合适的数据结构中;这容易出错,并且对按钮之一进行任何更改都可能需要对fxml进行16次更改。使用嵌套的for循环,您需要编写仅在将按钮存储在例如嵌套数组中后才创建按钮的逻辑可以同时进行...)
,
据我了解,一旦显示了第二阶段,您就想玩蝴蝶序列...要实现这一目标,您可以尝试以下操作:
List positions = new ArrayList(); //places to show butterfly (e.g. table cells)
secondStage.setOnShown(windowEvent -> {
// update UI with Pltform.runLater()
// moveButerflyTo() is your method to place butterfly on given place
positions.forEach(position -> Platform.runLater(() -> moveButerflyTo(position)));
});
我没有尝试过,但是可以完成工作...
本文链接:https://www.f2er.com/3153983.html