如何从javafx新场景自动运行代码

如何从javafx新场景自动运行代码,javafx,scenebuilder,Javafx,Scenebuilder,我对Java完全陌生,我在为一个学校项目开发应用程序的同时学习Java 我想编写上面的程序。在里面, 用户将单击屏幕1中的就绪按钮。 然后屏幕2将出现,蝴蝶的图像将按照我给出的顺序显示[使用CSV文件预设],如屏幕2和3所示。 最后,一个按钮集将出现在网格中,用户必须按照蝴蝶外观的顺序选择按钮。 我一直在寻找一种方法来启动第二屏并自动播放蝴蝶的序列 我尝试将image.setimage放在screen 2控制器的初始化块上,每个setimage之间有一个延迟。但它不起作用 有人能给我建议一种处理

我对Java完全陌生,我在为一个学校项目开发应用程序的同时学习Java

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

用户将单击屏幕1中的就绪按钮。 然后屏幕2将出现,蝴蝶的图像将按照我给出的顺序显示[使用CSV文件预设],如屏幕2和3所示。 最后,一个按钮集将出现在网格中,用户必须按照蝴蝶外观的顺序选择按钮。 我一直在寻找一种方法来启动第二屏并自动播放蝴蝶的序列

我尝试将image.setimage放在screen 2控制器的初始化块上,每个setimage之间有一个延迟。但它不起作用


有人能给我建议一种处理这类任务的方法吗?事先非常感谢。

据我所知,在第二阶段放映后,您希望播放蝴蝶系列……为了实现这一目标,您可以尝试以下方法:

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)));
});

我没有试过,但它可以完成任务…

对于初学者来说,这类代码经常遇到的问题是在应用程序线程上执行睡眠或其他长时间运行的操作来制作动画。但是,阻止javafx应用程序线程会导致场景未更新,从而导致gui冻结

您需要将此动画的长时间运行部分移动到后台线程,并使用Platform.runLater进行任何GUI更新,或者使用专门为此目的设计的东西。javafx.animation包中有多个类可能很有用,但最方便的类似乎是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循环,您只需编写一次创建按钮的逻辑即可将按钮存储在一个嵌套数组中,例如,可以同时完成…

我怀疑蝴蝶是否需要在几毫秒内的所有位置显示。这样的代码可能只会将蝴蝶显示在最终位置。位置列表应为随机和一些定时器延迟可以实现。感谢我设法实现了一个时间线和两个场景之间的切换。