如何从javafx new Scene自动运行代码

问题描述 投票:0回答:2

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

Image Link

我想对以上程序进行编码。在其中,

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

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

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

任何人都可以建议我一种处理此类任务的方法吗?预先感谢。

javafx scenebuilder
2个回答
0
投票

据我所知,一旦显示了第二阶段,您就想玩蝴蝶序列...要实现这一目标,您可以尝试类似的操作:

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

我没有尝试过,但是可以完成工作...


0
投票

对于初学者来说,这种代码经常出现的问题是在应用程序线程上执行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循环,您需要编写仅在将按钮存储在例如嵌套数组中后才创建按钮的逻辑可以同时进行...)

© www.soinside.com 2019 - 2024. All rights reserved.