Использование Platform.runLater для изменения текста кнопки в потоке не javafx - PullRequest
1 голос
/ 10 июля 2019

Я пытаюсь обновить текст кнопки из потока, не являющегося javafx, используя Platform.runLater, но текст не меняется

Код:

    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'

1 Ответ

4 голосов
/ 10 июля 2019

Вызов Platform.runLater не ожидает завершения Runnable перед возвратом.Из документации ( выделение моя):

Запустите указанный Runnable в потоке приложений JavaFX в некоторое неопределенное время в будущем .Этот метод, который может быть вызван из любого потока, отправит Runnable в очередь событий и , а затем немедленно вернется к вызывающей стороне .Runnables выполняются в порядке их размещения.Runnable, переданный в метод runLater, будет выполнен до того, как любой Runnable будет передан в последующий вызов runLater.Если этот метод вызывается после завершения выполнения JavaFX, вызов будет проигнорирован: Runnable не будет выполнен и не будет выдано исключение.

...

Это означает, что нет никакой гарантии, что текст Button был обновлен к тому времени, когда вызывается следующее:

System.out.println("after " + button);

Обратите внимание, что если все это произошло в Потоке приложений JavaFX вы все еще не увидите изменения.Это связано с тем, что поток FX не имел бы возможности обработать Runnable, который все еще будет находиться в очереди событий.


Кроме того, вы не устанавливаете случайное до отношение между записью потока FX в свойство text и фоновым потоком, считывающим из свойства text.Даже если потоку FX удалось установить свойство до того, как вы попытаетесь напечатать его System.out, нет гарантии, что ваш фоновый поток увидит новое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...