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.
- Когда использовать пул streamов в C #?
- Как бы вы определили пул goroutines, которые будут выполнены сразу в Голанге?
- Пауза / остановка и запуск / возобновление Java TimerTask непрерывно?
- Как выполнить функтор или lambda в заданном streamе в Qt, GCD-стиле?
- Синхронизация не конечного поля
Я попытался использовать Platform.runLater()
, он работает, но он сбой моей программы. Я также попытался создать Timer на Platform.runLater(new Runnable() { })
метод Platform.runLater(new Runnable() { })
но он дает мне ту же ошибку, что и раньше.
- Можно ли использовать строку в качестве объекта блокировки?
- Как я могу обернуть метод, чтобы я мог убить его выполнение, если он превышает указанный тайм-аут?
- Смешивание атома C ++ 11 и OpenMP
- снижая приоритет Task.Factory.StartNew thread
- Как подождать, когда BackgroundWorker отменит?
- Java Подождите, пока stream завершится
- Есть ли способ настройки культуры для целого приложения? Все текущие streamи и новые streamи?
- ObservableCollection и резьба
Wrap timer.setText()
в Platform.runLater()
. Вне этого внутри цикла while добавьте Thread.sleep(1000);
Причина исключения Illegal State Exception заключается в том, что вы пытаетесь обновить интерфейс для некоторых streamов, отличных от streamа приложений JavaFX.
Причина, по которой ваше приложение рушилось, когда вы добавили его, было перегрузкой streamа пользовательского интерфейса, добавив процесс, который будет выполняться в streamе пользовательского интерфейса, бесконечно. Снижение streamа на 1000 мсек поможет вам решить эту проблему.
Если возможно, замените (true) таймером или таймером.
Для получения дополнительных параметров следуйте по этой ссылке