java - 为什么我的JavaFX有这个程序流程问题?

标签 java maven javafx netbeans fxml

使用 JavaFX 和 FXML,我尝试显示一个包含一些基本信息的屏幕,然后当 HTTP 调用返回时,更新该屏幕。相反,在调用返回之前,屏幕根本不会显示。下面是该问题的最小案例测试,其中延迟旨在模拟 HTTP 调用。

我希望显示屏幕,更新第一个标签,延迟十秒,然后更新第二个标签。相反,直到延迟完成后才会显示屏幕,无论我将延迟放在哪里,都会发生这种情况。我希望我忽略了一些简单的事情,而不是必须创建多个线程来完成如此简单的事情。我认为下面的代码足以让任何人能够回答这个问题。如果需要,我可以添加更多代码。

@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();

}

最佳答案

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

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

关于java - 为什么我的JavaFX有这个程序流程问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59889114/

相关文章:

android - 找不到 manifest-merger.jar (com.android.tools.build :manifest-merger:26. 0.1)

java - 为 JavaFX 按钮数组中的每个按钮分配一个操作

java - 用于获取 JavaFX WebView 控制台事件的公共(public) API 是什么?

Java Maven 组装插件 编译 fatal error : invalid target release 1. 14

java - 当 Activity 屏幕首次在 Android Studio 上加载时,如何在隐藏背景中发送带有当前位置数据的 SMS 文本消息?

java - 无法在其他类中设置 JavaFX MenuBar 的样式

java - jsp tomcat 与 netbeans 中的 c3p0 连接池

java - JPA 注释和 mappedBy

java - 向maven项目添加方面

java - 使 Tomcat 忽略 WEB-INF/LIB 中的 Servlet