我正在尝试使用 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)
对 的调用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
| 归档时间: |
|
| 查看次数: |
394 次 |
| 最近记录: |