我不确定我做错了什么。
我创建了一个计时器,用于更新GUI顶部的Text图形。当计时器用完时,它会更改一个变量(链接到一个监听器),并在我的GUI中添加一个新的图形“Scene / Group / Node”。
- 更改我的变量//链接到ChangeListener - 并将一个场景添加到我的GUI //不是一个监听器,而是将新元素添加到我的GUI
这两个添加都会导致我的程序因该错误而崩溃:
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)
示例错误代码:
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();
我的current_player听众:
current_player.addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
//Code in Here
}
{);
答案 0 :(得分:1)
显然不是异常消息。您使用Swing timer,它在Event Dispatch Thread上调用其侦听器(使用Swing应用程序时需要)。
但是,您在该线程上更新JavaFX UI,而不是在FX应用程序线程上更新。
我(还)熟悉JavaFX,但希望他们有一个你可以使用的计时器机制,或类似于EventQueue.invokeAndWait
的{{1}}方法< / p>
修改强>
做了一些谷歌搜索,发现this page about concurrency in JavaFX这可能是一个很好的阅读。但是,没有提到计时器类。也许Animation
类正是你要找的