[英]Using Platform.runLater to change button text in non javafx thread
我正在嘗試使用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);
日志:
before Button[id=pc, styleClass=button]'test1'
after Button[id=pc, styleClass=button]'test1'
在返回之前,對Platform.runLater
的調用不會等待Runnable
完成。 從文檔 ( 重點是我的):
將來在某個未指定的時間在 JavaFX Application Thread上運行指定的Runnable。 可以從任何線程調用的此方法會將Runnable張貼到事件隊列, 然后立即返回給調用者 。 Runnable將按照它們的發布順序執行。 傳遞給runLater方法的runnable將在傳遞給后續對runLater的調用的任何Runnable之前執行。 如果在關閉JavaFX運行時之后調用此方法,則該調用將被忽略:Runnable將不會執行,並且不會引發任何異常。
...
這意味着不能保證在調用以下命令時Button
的文本已被更新:
System.out.println("after " + button);
請注意,如果所有這些都發生在JavaFX Application Thread上,您仍然看不到更改。 這是因為FX線程還沒有機會處理Runnable
,而Runnable
仍然位於事件隊列中。
此外,您不會在FX線程寫入text
屬性與從text
屬性讀取背景線程之間建立事前-事前關系。 即使FX線程在嘗試將屬性打印到System.out
之前成功設置了屬性,也無法保證您的后台線程會看到新值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.