首页 > 解决方案 > 如何从 javafx new Scene 自动运行代码

问题描述

我对 Java 完全陌生,我在为学校项目开发应用程序时正在学习它。

图片链接

我想编写上面的程序。在里面 ,

  1. 用户将单击屏幕 1 中的就绪按钮。
  2. 然后屏幕 2 会出现,蝴蝶的图像将按照我给定的顺序显示[使用 CSV 文件预设] 如屏幕 2 和 3 所示。
  3. 最后,一个按钮集将出现在网格中,用户必须按照蝴蝶出现的顺序选择按钮。

我一直在寻找一种方法来启动屏幕 2 并自动播放蝴蝶序列。

我尝试将image.setimage() initialize() 块放在我的屏幕 2 控制器中,每个 setimage() 之间有一个延迟。但它不起作用。

任何人都可以建议我处理此类任务的方法吗?提前非常感谢。

标签: javafxscenebuilder

解决方案


对于初学者来说,这种代码经常看到的问题是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 循环,您需要编写仅在将按钮存储在例如嵌套数组中时创建按钮的逻辑可以同时完成......)


推荐阅读