J'ai une application qui a un TableView
qui a un écouteur attaché donc il se rafraîchit dès qu'il détecte un changement, mais le fait est que je reçois Java.lang.IllegalStateException: Not on FX application thread; currentThread = Smack Listener Processor (0)
. Voici mon code:
/**
* 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");
}
}
}
});
}
Bien qu'il entre dans la méthode resetPage, je reçois cette exception. Pourquoi cela arrive-t-il? Comment puis-je le réparer? Merci d'avance.
L'interface utilisateur ne peut pas être directement mise à jour à partir d'un thread non-application. À la place, utilisez Platform.runLater()
, avec la logique à l'intérieur de l'objet Runnable. Par exemple:
Platform.runLater(new Runnable() {
@Override
public void run() {
// Update UI here.
}
});
Comme expression lambda:
// Avoid throwing IllegalStateException by running from a non-JavaFX thread.
Platform.runLater(
() -> {
// Update UI here.
}
);
Le code JavaFX permet de mettre à jour l'interface utilisateur à partir d'un thread d'application JavaFX. Mais à partir du message d'exception ci-dessus, il indique qu'il n'utilise pas le thread d'application FX.
Une façon de résoudre ce problème consiste à lancer un thread d'application FX à partir de la méthode resetPage et à y apporter les modifications.