当前位置: 首页 > 面试题库 >

java.lang.IllegalStateException:不在FX应用程序线程上;currentThread =线程4

狄新翰
2023-03-14
问题内容

我正在尝试从线程中设置文本对象的字符串,但这给了我这个错误:

Exception in thread "Thread-4" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-4
at com.sun.javafx.tk.Toolkit.checkFxUserThread(Unknown Source)
at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(Unknown Source)
at javafx.scene.Scene.addToDirtyList(Unknown Source)
at javafx.scene.Node.addToSceneDirtyList(Unknown Source)
at javafx.scene.Node.impl_markDirty(Unknown Source)
at javafx.scene.shape.Shape.impl_markDirty(Unknown Source)
at javafx.scene.Node.impl_geomChanged(Unknown Source)
at javafx.scene.text.Text.impl_geomChanged(Unknown Source)
at javafx.scene.text.Text.needsTextLayout(Unknown Source)
at javafx.scene.text.Text.needsFullTextLayout(Unknown Source)
at javafx.scene.text.Text.access$200(Unknown Source)
at javafx.scene.text.Text$2.invalidated(Unknown Source)
at javafx.beans.property.StringPropertyBase.markInvalid(Unknown Source)
at javafx.beans.property.StringPropertyBase.set(Unknown Source)
at javafx.beans.property.StringPropertyBase.set(Unknown Source)
at javafx.scene.text.Text.setText(Unknown Source)
at uy.com.vincent.fx.handling.TableController$1.run(TableController.java:70)

处理程序类:

@FXML
private Text timer;

@Override
public void initialize(URL url, ResourceBundle rb) {
    init();
    new Thread() {
        public void run() {
            while(true) {
                Calendar cal = new GregorianCalendar();

                int hour = cal.get(cal.HOUR);
                int minute = cal.get(cal.MINUTE);
                int second = cal.get(cal.SECOND);
                int AM_PM = cal.get(cal.AM_PM);

                String time = hour + "" + minute + "" + second;
                timer.setText(time);
            }
        }
    }.start();
}

我尝试使用Platform.runLater(),它确实可以工作,但是它使我的程序崩溃。我也尝试在该Platform.runLater(new Runnable() { })方法上创建一个Timer,但它给了我与以前相同的错误。


问题答案:

timer.setText()起来Platform.runLater()。在它的外面,在while循环中,添加Thread.sleep(1000);

非法状态异常的原因是你试图在JavaFX Application线程以外的其他线程上更新UI。

添加应用程序时崩溃的原因是,通过无限期添加要在UI线程上执行的进程,UI线程过载。使线程hibernate1000ms将有助于你解决此问题。

如果可能,用Timer或TimerTask替换while(true)。



 类似资料:
  • 下面的代码片段给我错误< code >不在FX应用程序线程上;当前线程 = < code > Java FX < code >应用程序线程。这个应用程序在java 1.7中运行良好,但是当我把它移到fx8时,它现在出现错误。当我第一次尝试启动应用程序时,它按预期工作。但是在关闭并再次打开舞台后,它不起作用了。 错误也不明确。如果当前线程是fx应用程序线程,那么不在fx应用线程上意味着什么。

  • 问题内容: 我试图通过使用JInternalFrame附加JFXPanel来使用JavaFx 2.x和Swing应用程序 我的代码如下 我有这个例外 就我的目的而言,我必须使用JInternalFrame:如何解决此问题? 问题答案: 请参阅“ Swing中的JavaFX”教程。您正在执行应在Swing线程(事件调度线程)上的JavaFX线程上运行的JavaFX操作。 幸运的是,他们从以前的错误中

  • 我正试图通过使用一个JInternalFrame来使用JavaFx2.x和Swing应用程序,其中附加了一个JFXPanel 我在下面的代码 我有这个例外 对于我的目的,我必须使用JInternalFrame:我如何解决这个问题?

  • 问题内容: 我正在用这个 但是这个: 给我这个错误: 而且我真的不明白怎么了 问题答案: 可能是因为您误解了工作原理。 正确的代码段为: 但: 我强烈建议您不要使用,而是使用!它是JavaFX API的一部分,您不必执行这些调用。这只是很快就被黑了,但是您知道了:

  • 当我创建一个简单的非多线程JavaFX应用程序并启动它时,该应用程序会创建一些线程(JavaFXApplicationThread、JavaFXLauncher等)。这些线程中的大多数都已命名,但在我的所有JavaFX应用程序中都有一个未命名的线程(“线程-1”或“线程-2”)。我绝对不会创建自己的线程,因为我尝试启动Hello World JavaFX应用程序(由IDEA生成),其中也包含“线程

  • 我有一个在多个线程上创建可运行对象(来自同一类的实例)的程序,每个可运行对象包含一个使用发布事件和@EventListener接收事件的对象。 我想做的是工作线程上的接收器只接收从该线程发布的事件。 由于多个线程上的对象中的方法签名是相同的,所以不确定是否从一个线程发布了一个事件,那么所有线程都将收到相同的事件更改?如果是这样,那么如何确保工作线程只接收在该线程上发布的事件?