java.lang.IllegalStateException: Nicht im FX-Anwendungs-Thread; currentThread = Thread-4

Ich versuche, die Zeichenfolge eines Text-Objekts aus einem Thread zu setzen, aber es gibt mir diesen Fehler:

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) 

Handler class:

 @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(); } 

Ich folge einem Tutorial . Der Typ im Lernprogramm verwendet JavaFX nicht.

Ich habe versucht, Platform.runLater() , es funktioniert, aber es stürzt mein Programm ab. Ich habe auch versucht, einen Timer auf der Platform.runLater(new Runnable() { }) -Methode zu Platform.runLater(new Runnable() { }) , aber es gibt mir den gleichen Fehler wie zuvor.

Wickeln Sie timer.setText() in Platform.runLater() . Draußen innerhalb der while-Schleife Thread.sleep(1000); hinzufügen Thread.sleep(1000);

Der Grund für den Ausnahmeerrors “Illegal State” besteht darin, dass Sie versuchen, die Benutzeroberfläche für einen anderen Thread als den JavaFX-Anwendungsthread zu aktualisieren.

Der Grund für den Absturz Ihrer App beim Hinzufügen war, dass Sie den UI-Thread überladen haben, indem Sie einen process hinzugefügt haben, der unendlich auf dem UI-Thread ausgeführt werden soll. Wenn Sie den Thread 1000ms lang schlafen lassen, können Sie das Problem lösen.

Falls möglich, ersetzen Sie while (true) mit einem Timer oder TimerTask.

Für weitere Optionen folgen Sie diesem Link