java - 错误!线程 "AWT-EventQueue-0"java.lang.IllegalStateException : Not on FX application thread; currentThread = AWT-EventQueue-0 中的异常

标签 java exception timer listener illegalstateexception

我不确定我做错了什么。

我创建了一个计时器,用于更新 GUI 顶部的文本图形。但是,当计时器用完时,它会更改一个变量(链接到一个监听器),并向我的 GUI 添加一个新的图形“场景/组/节点”。

-更改我的变量//链接到 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
}
{);

最佳答案

异常信息不是很明显吗?您使用 Swing timer ,它在事件调度线程上调用它的监听器(使用 Swing 应用程序时需要)。

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

我(还)不熟悉 JavaFX,但希望他们也有这样的定时器机制,您可以使用,或者类似于 EventQueue.invokeAndWait 的东西,您可以在 actionPerformed 方法

编辑:

做了一些谷歌搜索并找到了 this page about concurrency in JavaFX这可能是一本好书。但是,没有提到计时器类。也许是 Animation类就是你要找的

关于java - 错误!线程 "AWT-EventQueue-0"java.lang.IllegalStateException : Not on FX application thread; currentThread = AWT-EventQueue-0 中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9987400/

相关文章:

java - 在尊重差异的同时多次继承通用接口(interface)

java - 为什么我收到 "package R does not exist"错误?

java - 为包装库设计异常类

java - 如何使用 SwingWorker 和/或 Timer?

java - Netty 如何使用线程池?

c# - 实现返回任务的方法时的契约(Contract)约定

java - 从网站提取数据时出现异常

c:计时器不允许程序完成

Sharepoint:从计时器作业执行 stsadm + SHAREPOINT\System 权限

Java递归方法结束但不终止