netbeans 为什么我的JavaFX会出现此程序流问题?

x3naxklr  于 2022-11-10  发布在  Java
关注(0)|答案(1)|浏览(140)

使用JavaFX和FXML,我试图显示一个包含一些基本信息的屏幕,然后当HTTP调用返回时,更新该屏幕。实际情况是,在调用返回之前,屏幕根本不显示。下面是对该问题的最小情况测试,其中有一个延迟,用于模拟HTTP调用。
我希望屏幕显示,第一个标签更新,10秒的延迟,然后第二个标签更新。相反,屏幕直到延迟结束后才显示,我希望我忽略了一些简单的事情,而不是必须创建多个线程来做这么简单的事情。下面是足够的代码,我认为任何人都可以回答这个问题。我可以包括更多的代码,如果需要的话。

@Override
public void start(Stage stage) throws IOException {

    this.stage = stage;
    FXMLLoader loader = new FXMLLoader();
    loader.setLocation(App.class.getResource("primary.fxml"));
    anchroot = (AnchorPane) loader.load();
    // Show the scene containing the root layout.
    Scene scene = new Scene(anchroot);
    stage.setScene(scene);
    // Give the controller access to the main app.
    PrimaryController controller = loader.getController();
    controller.setMainApp(this);
    stage.show();

    //change the first label
    controller.setLabel0();

    //timer to simulate IO
    try {
        TimeUnit.SECONDS.sleep(10);
    } catch (Exception e) {
        e.printStackTrace();
    }

    //try to change the second label 10 sec later
    controller.setLabel1();

}
bq3bfh9z

bq3bfh9z1#

调用TimeUnit.SECONDS.sleep(10);将使JavaFX线程阻塞10秒。在这种情况下,您将无法看到GUI线程中的任何更改,直到休眠期结束。在JavaFX中,您可以使用Timeline在特定时间段后进行更新:

controller.setLabel0();
new Timeline(new KeyFrame(Duration.seconds(10), event -> controller.setLabel1())).play();

相关问题