gpt4 book ai didi

JavaFX,primaryStage.show () 之后的代码,怎么样?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:32:37 26 4
gpt4 key购买 nike

我的目标是在 Stage + Scene 出现后,每秒查看矩形的颜色变化。

我研究并尝试了几件事:

  • primaryStage.show() 下的代码[看我的示例代码]
  • primaryStage.setOnShown() 或 primaryStage.setOnShowing()
  • 来自舞台的事件处理程序
  • 来自场景的事件处理程序
  • 带事件处理器的按钮

一切都是徒劳的。在大多数情况下,舞台来了,然后程序在后台执行颜色更改(没有可视化),最后场景和最终结果一起出现。或版本 2:我什么也没看到,代码通过,最后立即得出最终结果。

这是我的代码:

package sample;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;


public class Main extends Application {

@Override
public void start(Stage primaryStage) throws Exception{
GridPane gridPane = new GridPane();

Rectangle[] recs = new Rectangle[10];
for (int i = 0; i < recs.length; i++) {
recs[i] = new Rectangle(30, 30, Color.GREEN);
recs[i].setStroke(Color.BLACK);
gridPane.add(recs[i], i, 0);
}

primaryStage.setTitle("Code after primaryStage.show()");
primaryStage.setScene(new Scene(gridPane, 400, 300));
primaryStage.show();


for (Rectangle rec : recs) {
Thread.sleep(1000);
rec.setFill(Color.ORANGE);
}
}


public static void main(String[] args) {
launch(args);
}
}

最佳答案

这里的问题是您的循环在主应用程序线程上运行,因此它会锁定任何 GUI 更新,直到它完成。

改为在它自己的线程上执行循环并使用 Platform.runLater() 更新每个矩形:

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;


public class Main extends Application {

@Override
public void start(Stage primaryStage) throws Exception {
GridPane gridPane = new GridPane();

Rectangle[] recs = new Rectangle[10];
for (int i = 0; i < recs.length; i++) {
recs[i] = new Rectangle(30, 30, Color.GREEN);
recs[i].setStroke(Color.BLACK);
gridPane.add(recs[i], i, 0);
}

primaryStage.setTitle("Code after primaryStage.show()");
primaryStage.setScene(new Scene(gridPane, 400, 300));
primaryStage.show();

new Thread(() -> {
for (Rectangle rec :
recs) {
try {
Thread.sleep(1000);
Platform.runLater(() -> rec.setFill(Color.ORANGE));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();

}

public static void main(String[] args) {
launch(args);
}
}

那么发生了什么?

new Thread(() -> {

在您的应用程序后台打开一个新线程,以便 UI 保持响应。

然后我们可以在 try/catch block 中开始您的循环。

Platform.runLater(() -> rec.setFill(Color.ORANGE));

当使用后台线程时,重要的是要知道您不能直接对 UI 进行更改。这一行告诉 JavaFX 在 JavaFX 应用程序线程上执行 rec.setFill() 语句。

.start();

您已经创建了新的 Thread,这只是启动它。

关于JavaFX,primaryStage.show () 之后的代码,怎么样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50843652/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com