runlater - java.lang.IllegalStateException: no en el hilo de la aplicación FX; currentThread=Thread-4
runlater javafx (1)
Estoy tratando de establecer la cadena de un objeto de texto desde un hilo pero me está dando este error:
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)
Clase de manejador :
@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();
}
Estoy siguiendo un tutorial . El chico del tutorial no está usando JavaFX.
He intentado usar
Platform.runLater()
, funciona pero bloquea mi programa.
También intenté crear un temporizador en
Platform.runLater(new Runnable() { })
pero me da el mismo error que antes.
Envuelva
timer.setText()
en
Platform.runLater()
.
Fuera de él, dentro del bucle while, agregue
Thread.sleep(1000);
La razón detrás de la excepción de estado ilegal es que está intentando actualizar la interfaz de usuario en algún subproceso que no sea el subproceso de aplicación JavaFX.
La razón por la cual su aplicación se bloqueó cuando la agregó fue que estaba sobrecargando el subproceso de la interfaz de usuario al agregar un proceso que se ejecutará en el subproceso de la interfaz de usuario infinitamente. Hacer que el hilo duerma durante 1000 ms lo ayudará a superar el problema.
Si es posible, reemplace while (verdadero) con un Timer o TimerTask.
Para más opciones sigue este enlace