java.lang.IllegalStateException: не для streamа приложений FX; currentThread = Thread-4

Я пытаюсь установить строку объекта Text из streamа, но это дает мне эту ошибку:

Exception in thread "Thread-4" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-4 at com.sun.javafx.tk.Toolkit.checkFxUserThread(Unknown Source) at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(Unknown Source) at javafx.scene.Scene.addToDirtyList(Unknown Source) at javafx.scene.Node.addToSceneDirtyList(Unknown Source) at javafx.scene.Node.impl_markDirty(Unknown Source) at javafx.scene.shape.Shape.impl_markDirty(Unknown Source) at javafx.scene.Node.impl_geomChanged(Unknown Source) at javafx.scene.text.Text.impl_geomChanged(Unknown Source) at javafx.scene.text.Text.needsTextLayout(Unknown Source) at javafx.scene.text.Text.needsFullTextLayout(Unknown Source) at javafx.scene.text.Text.access$200(Unknown Source) at javafx.scene.text.Text$2.invalidated(Unknown Source) at javafx.beans.property.StringPropertyBase.markInvalid(Unknown Source) at javafx.beans.property.StringPropertyBase.set(Unknown Source) at javafx.beans.property.StringPropertyBase.set(Unknown Source) at javafx.scene.text.Text.setText(Unknown Source) at uy.com.vincent.fx.handling.TableController$1.run(TableController.java:70) 

Класс обработчика :

 @FXML private Text timer; @Override public void initialize(URL url, ResourceBundle rb) { init(); new Thread() { public void run() { while(true) { Calendar cal = new GregorianCalendar(); int hour = cal.get(cal.HOUR); int minute = cal.get(cal.MINUTE); int second = cal.get(cal.SECOND); int AM_PM = cal.get(cal.AM_PM); String time = hour + "" + minute + "" + second; timer.setText(time); } } }.start(); } 

Я следую учебнику . Парень в учебнике не использует JavaFX.

Я попытался использовать Platform.runLater() , он работает, но он сбой моей программы. Я также попытался создать Timer на Platform.runLater(new Runnable() { }) метод Platform.runLater(new Runnable() { }) но он дает мне ту же ошибку, что и раньше.

Wrap timer.setText() в Platform.runLater() . Вне этого внутри цикла while добавьте Thread.sleep(1000);

Причина исключения Illegal State Exception заключается в том, что вы пытаетесь обновить интерфейс для некоторых streamов, отличных от streamа приложений JavaFX.

Причина, по которой ваше приложение рушилось, когда вы добавили его, было перегрузкой streamа пользовательского интерфейса, добавив процесс, который будет выполняться в streamе пользовательского интерфейса, бесконечно. Снижение streamа на 1000 мсек поможет вам решить эту проблему.

Если возможно, замените (true) таймером или таймером.

Для получения дополнительных параметров следуйте по этой ссылке

  • Java Wait и Notify: IllegalMonitorStateException
  • Как реализовать многопоточный безопасный синглтон в C ++ 11 без использования
  • Параллелирование GDI + изменение размера .net
  • Почему wait () и notify () объявлены в classе объектов Java?
  • Является ли это идиоматическим пулом рабочих streamов в Go?
  • SpinWait против ожидания ожидания. Какой из них использовать?
  • Как приостановить, а затем возобновить stream?
  • Как оценить накладные расходы на переключение streamов?
  • Является ли этот thread.abort () нормальным и безопасным?
  • Где я могу получить streamобезопасный CollectionView?
  • Простейший и понятный пример ключевого слова volatile в java
  • Давайте будем гением компьютера.