3

我不确定我做错了什么。

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

1 回答 1

1

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

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

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

编辑:

做了一些谷歌搜索,发现这个关于 JavaFX 并发的页面可能是一个很好的阅读。但是,没有提到计时器类。也许这Animation门课就是你要找的

于 2012-04-03T05:30:24.037 回答