使用 Platform.runLater 更改非 javafx 线程中的按钮文本

1 java javafx

我正在尝试使用 Platform.runLater 从非 javafx 线程更新按钮文本,但文本没有改变

代码:

    FXMLLoader loader = new FXMLLoader(getClass().getResource("GUI.fxml"));
    Parent root = loader.load();
    Map<String, Object> namespace = loader.getNamespace();

    Button button = (Button) namespace.get("pc");

    System.out.println("before " + button);
    Platform.runLater(() -> button.setText("test2"));
    System.out.println("after " + button);
Run Code Online (Sandbox Code Playgroud)

日志:

before Button[id=pc, styleClass=button]'test1'
after Button[id=pc, styleClass=button]'test1'
Run Code Online (Sandbox Code Playgroud)

Sla*_*law 5

对 的调用Platform.runLater不会等待Runnable完成后再返回。从文档重点是我的):

在将来某个未指定的时间在 JavaFX 应用程序线程上运行指定的 Runnable 。该方法可以从任何线程调用,它将把 Runnable 发布到事件队列,然后立即返回给调用者。Runnables 按照发布的顺序执行。传入 runLater 方法的 runnable 将在任何 Runnable 传入后续调用 runLater 之前执行。如果在 JavaFX 运行时关闭后调用此方法,则该调用将被忽略:Runnable 将不会被执行,也不会抛出任何异常。

...

这意味着不能保证Button的文本在调用以下命令时已更新:

System.out.println("after " + button);
Run Code Online (Sandbox Code Playgroud)

请注意,如果所有这些都发生在JavaFX 应用程序线程上,您仍然看不到更改。这是因为 FX 线程没有机会处理 Yet Runnable,它仍然位于事件队列中。


此外,您并未在写入属性的 FX 线程与读取属性的后台线程之间建立发生前关系。即使 FX 线程在您尝试打印该属性之前设法设置该属性,也不能保证您的后台线程会看到新值。texttextSystem.out

  • 这听起来像是一个[新问题](/sf/)(不要忘记[mre])。 (2认同)