¿Por qué recibo java.lang.IllegalStateException "No en el hilo de la aplicación FX" en JavaFX?
javafx-2 smack (2)
Tengo una aplicación que tiene un TableView
que tiene un detector adjunto, por lo que se actualiza tan pronto como detecta un cambio, pero el problema es que estoy obteniendo java.lang.IllegalStateException: Not on FX application thread; currentThread = Smack Listener Processor (0)
java.lang.IllegalStateException: Not on FX application thread; currentThread = Smack Listener Processor (0)
. Aquí está mi código:
/**
* This function resets the pagination pagecount
*/
public void resetPage() {
try {
System.out.println("RESET");
int tamRoster = this.loginManager.getRosterService().getRosterList().size();
paginationContactos.setPageCount((int)(Math.ceil(tamRoster*1.0/limit.get())));
int tamEnviados = this.loginManager.getRosterService().getEnviadasList().size();
paginationEnviadas.setPageCount((int)(Math.ceil(tamEnviados*1.0/limit.get())));
int tamRecibidas = this.loginManager.getRosterService().getRecibidasList().size();
paginationRecibidas.setPageCount((int)(Math.ceil(tamRecibidas*1.0/limit.get())));
} catch (Exception e) {
e.printStackTrace();
}
}
public void doSomething () {
this.loginManager.getRosterService().getRosterList().addListener(new ListChangeListener<RosterDTO>() {
@Override
public void onChanged(
javafx.collections.ListChangeListener.Change<? extends RosterDTO> c) {
// TODO Auto-generated method stub
resetPage();
while (c.next()) {
if (c.wasPermutated()) {
System.out.println("PERM");
} else if (c.wasUpdated()) {
System.out.println("UPD");
} else {
System.out.println("ELSE");
}
}
}
});
}
A pesar de que ingresa al método resetPage, obtengo esa excepción. ¿Por qué está pasando esto? ¿Cómo puedo arreglarlo? Gracias por adelantado.
El código JavaFX permite actualizar la UI desde una secuencia de aplicación JavaFX. Pero a partir del mensaje de excepción anterior, dice que no está utilizando el hilo de la aplicación FX.
Una forma de solucionarlo es iniciar un subproceso de la aplicación FX desde el método resetPage y realizar las modificaciones allí.
La interfaz de usuario no se puede actualizar directamente desde un hilo que no sea de aplicación. En su lugar, use Platform.runLater()
, con la lógica dentro del objeto Runnable. Por ejemplo:
Platform.runLater(new Runnable() {
@Override
public void run() {
// Update UI here.
}
});
Como una expresión lambda:
// Avoid throwing IllegalStateException by running from a non-JavaFX thread.
Platform.runLater(
() -> {
// Update UI here.
}
);