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
}
{);
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With