javafx - 如何从 javafx new Scene 自动运行代码
问题描述
我对 Java 完全陌生,我在为学校项目开发应用程序时正在学习它。
我想编写上面的程序。在里面 ,
- 用户将单击屏幕 1 中的就绪按钮。
- 然后屏幕 2 会出现,蝴蝶的图像将按照我给定的顺序显示[使用 CSV 文件预设] 如屏幕 2 和 3 所示。
- 最后,一个按钮集将出现在网格中,用户必须按照蝴蝶出现的顺序选择按钮。
我一直在寻找一种方法来启动屏幕 2 并自动播放蝴蝶序列。
我尝试将image.setimage()
initialize() 块放在我的屏幕 2 控制器中,每个 setimage() 之间有一个延迟。但它不起作用。
任何人都可以建议我处理此类任务的方法吗?提前非常感谢。
解决方案
对于初学者来说,这种代码经常看到的问题是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 个场景:用户希望按钮和显示蝴蝶的“字段”具有相同的位置。如果您设计 2 个 fxml,对其中一个场景进行任何调整都需要您对另一个场景进行相同的调整。这使得布局难以维护。替代方案要求您在 java 代码中创建场景,但场景的重复性使得这无论如何都是一个好主意。(另一种方法是将 16 个字段注入控制器并将它们收集到合适的数据结构中;这很容易出错,并且任何一个按钮的更改都可能需要在 fxml 中进行 16 次更改。使用嵌套的 for 循环,您需要编写仅在将按钮存储在例如嵌套数组中时创建按钮的逻辑可以同时完成......)
推荐阅读
- javascript - 使用 Javascript 在文本区域中写一个换行符
- asp.net - “你调用的对象是空的。” 在 asp.net 中更新 GridView 时出错
- c# - Nuget - 从 packages.config 迁移到包参考后,项目无法找到参考
- rest - 是否可以使用 LinkedIn v1 API(春季社交)回复评论?
- r - 测试写入磁盘的包函数
- python - row.split 将逗号分隔的字符串作为一列
- java - 如何在没有模型类的情况下通过 MongoTemplate 获取 MongoDB 对象
- android - viewpager 片段之间的数据传递
- c# - 标签中的 Xamarin 绑定和普通文本
- git - 如何将新标签从 svn 导入 git-svn?