【问题标题】:ERROR! Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Not on FX application thread; currentThread = AWT-EventQueue-0错误!线程“AWT-EventQueue-0”java.lang.IllegalStateException 中的异常:不在 FX 应用程序线程上; currentThread = AWT-EventQueue-0
【发布时间】:2012-04-03 13:46:39
【问题描述】:

我不确定自己做错了什么。

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

【问题讨论】:

    标签: java exception timer listener illegalstateexception


    【解决方案1】:

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

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

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

    编辑:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-25
      • 1970-01-01
      • 1970-01-01
      • 2012-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多