错误!线程“AWT-EventQueue-0”中的异常java.lang.IllegalStateException:不在FX应用程序线程上; currentThread = AWT-EventQueue-0

时间:2012-04-03 05:03:34

标签: java exception timer listener illegalstateexception

我不确定我做错了什么。

我创建了一个计时器,用于更新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
}
{);

1 个答案:

答案 0 :(得分:1)

显然不是异常消息。您使用Swing timer,它在Event Dispatch Thread上调用其侦听器(使用Swing应用程序时需要)。

但是,您在该线程上更新JavaFX UI,而不是在FX应用程序线程上更新。

我(还)熟悉JavaFX,但希望他们有一个你可以使用的计时器机制,或类似于EventQueue.invokeAndWait的{​​{1}}方法< / p>

修改

做了一些谷歌搜索,发现this page about concurrency in JavaFX这可能是一个很好的阅读。但是,没有提到计时器类。也许Animation类正是你要找的