Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ERROR! Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Not on FX application thread; currentThread = AWT-EventQueue-0

I'm not sure what I'm doing wrong.

I created a timer that updates a Text graphic at the top of my GUI. When the timer runs out though, it changes a variable (which is linked to a listener), and adds a new graphic 'Scene/Group/Node' to my GUI.

-Changing my variable //Linked to a ChangeListener -And adding a Scene to my GUI //Not a listener, but adds new elements to my GUI

Both of these additions cause my program to crash with that error:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Not on FX application thread; currentThread = AWT-EventQueue-0
    at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:235)
    at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:393)

Sample Error Code:

int delay = new Integer(1000); //milliseconds
time_left=time_limit;


ActionListener taskPerformer = new ActionListener() {
        @Override
        public void actionPerformed(java.awt.event.ActionEvent arg0) {
            // TODO Auto-generated method stub
            timer.setText(time_left+" SECONDS LEFT");


            time_left=time_left-1;
            if (time_left<0)
            {
                //time_left=time_limit;
                mytimer.stop();
                //mytimer.start();
            root.getChildren().get(2).setOpacity(.2);
            //root.getChildren().add(3,newScene());         //This causes to crash      //Adds a new Scene to my GUI
            current_player.setValue(false);         //Also causes to crash - current_player has a Listener on it
                //System.out.println("TIMER RAN OUT!");
            }


        }
};
mytimer=new Timer(delay, taskPerformer);
mytimer.start();

my current_player listener:

current_player.addListener(new ChangeListener<Boolean>() {

            @Override
            public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
//Code in Here
}
{);
like image 947
CREW Avatar asked Mar 06 '26 06:03

CREW


1 Answers

Isn't the exception message obvious. You use a Swing timer, which calls its listener on the Event Dispatch Thread (needed when using Swing applications).

However, you update your JavaFX UI on that Thread, instead of on the FX application Thread.

I am not (yet) familiar with JavaFX, but hopefully they have such a timer mechanism as well which you can use, or something similar to EventQueue.invokeAndWait which you could use in the actionPerformed method

Edit:

did a bit of Googling and found this page about concurrency in JavaFX which might be a good read. However, no mention of a timer class. Perhaps the Animation class is what you are looking for

like image 116
Robin Avatar answered Mar 07 '26 20:03

Robin



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!