簡體   English   中英

使用Platform.runLater更改非JavaFX線程中的按鈕文本

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM