Why am I getting java.lang.IllegalStateException "Not on FX application thread" on JavaFX?

JavaJavafx 2Smack

Java Problem Overview


I have an application that has a TableView that has an attached listener so it refreshes as soon as it detects a change, but the thing is that I´m getting java.lang.IllegalStateException: Not on FX application thread; currentThread = Smack Listener Processor (0). Here is my 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");
					}
				}
			}
	     });
}

Altough it enters the resetPage method, I get that exception. Why is this happening? How can I fix it? Thanks in advance.

Java Solutions


Solution 1 - Java

The user interface cannot be directly updated from a non-application thread. Instead, use Platform.runLater(), with the logic inside the Runnable object. For example:

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

As a lambda expression:

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

Solution 2 - Java

JavaFX code allows updating the UI from an JavaFX application thread. But from the above exception message it says that it is not using FX Application thread.

One way you can fix is to launch an FX Application thread from the resetPage method and do the modifications there.

Solution 3 - Java

I had a similar issue which I fixed without using the Platform.runLater():

"java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-6"

Button play = new Button("Play");
EventHandler<ActionEvent> playHandler = e1 -> {
    Runnable runnable = () -> {

        play.setText("Pause");

        EventHandler<ActionEvent> timelineHandler e2 -> play();
        timeline = new Timeline(new KeyFrame(Duration.millis(2000), timelineHandler));
        timeline.setCycleCount(Timeline.INDEFINITE);
        timeline.play();

    };
    Thread t = new Thread(runnable);
    t.start();
};
play.setOnAction(playHandler);

SOLVED! Move everything unrelated outside of the runnable lambda:

Button play = new Button("Play");
EventHandler<ActionEvent> playHandler = e1 -> {
    play.setText("Pause");
    Runnable runnable = () -> {

        EventHandler<ActionEvent> timelineHandler e2 -> play();
        timeline = new Timeline(new KeyFrame(Duration.millis(2000), timelineHandler));
        timeline.setCycleCount(Timeline.INDEFINITE);
        timeline.play();

    };
    Thread t = new Thread(runnable);
    t.start();
};
play.setOnAction(playHandler);

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionlinker85View Question on Stackoverflow
Solution 1 - JavaMarcView Answer on Stackoverflow
Solution 2 - JavaMohamedSanaullaView Answer on Stackoverflow
Solution 3 - JavaLuke PalmerView Answer on Stackoverflow