Por que estou recebendo java.lang.IllegalStateException “Não no thread do aplicativo FX” no JavaFX?

Eu tenho um aplicativo que tem um TableView que tem um ouvinte anexado para que ele atualize assim que detecta uma alteração, mas a única coisa é que estou recebendo 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) . Aqui está o meu 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() { @Override public void onChanged( javafx.collections.ListChangeListener.Change 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"); } } } }); } 

Embora ele entre no método resetPage, recebo essa exceção. Por que isso está acontecendo? Como posso consertar isso? Desde já, obrigado.

A interface do usuário não pode ser atualizada diretamente de um encadeamento de não aplicativo. Em vez disso, use Platform.runLater() , com a lógica dentro do object Runnable. Por exemplo:

 Platform.runLater(new Runnable() { @Override public void run() { // Update UI here. } }); 

Como uma expressão lambda:

 // Avoid throwing IllegalStateException by running from a non-JavaFX thread. Platform.runLater( () -> { // Update UI here. } ); 

O código JavaFX permite atualizar a interface do usuário a partir de um encadeamento do aplicativo JavaFX. Mas a mensagem de exceção acima diz que ele não está usando o thread do aplicativo FX.

Uma maneira de consertar é iniciar um thread do aplicativo FX a partir do método resetPage e fazer as modificações nele.