Javafx Platform.runLater 永远不会运行

Posted

技术标签:

【中文标题】Javafx Platform.runLater 永远不会运行【英文标题】:Javafx Platform.runLater never running 【发布时间】:2015-05-31 21:47:57 【问题描述】:

我基本上希望能够在我的 LWJGL/GLFW 线程启动之后(和内部)启动一个新的 Javafx 窗口(阶段)。我基本上是在做:

Thread thread = new Thread(()->Platform.runLater(()->
    Stage stage = new Stage();
    //Stage setup
    stage.show();
));
thread.start();

线程是我的游戏线程。 但它永远不会运行,我在Platform.runLater() 中尝试了一个System.out.println(),只是为了检查它永远不会运行。

为什么它永远不会运行,我该怎么做才能修复它?谢谢。

编辑:只是为了澄清线程肯定已经开始等等,如果我这样做:

Thread thread = new Thread(()->
    System.out.println("Before Platform.runLater()");
    Platform.runLater(()->System.out.println("Inside Platform.runLater()"));
    System.out.println("After Platform.runLater()");
);

它输出:

Before Platform.runLater()
After Platform.runLater()

【问题讨论】:

您提供的那段代码似乎没有问题。你能检查一下thread.start();是否被调用并且线程正在启​​动。 使用您发布的代码,Thread 是多余的。您可以简单地从您所在的任何线程调用Platform.runLater(...)。这里的上下文是什么? FX 工具包和应用线程启动了吗? 是的,对不起,我已经大大简化了它,因为线程中的不同类中还有很多其他的东西。我绝对知道线程已启动,因为我的 GLFW 窗口来自哪里,我可以看到这一点。基本上我有我的 GLFW 窗口/游戏,我希望在一个条件之后也出现一个阶段(所以 GLFW 窗口必须先出现)。 FX 应用程序线程已启动,因为我使用 FX 应用程序启动 GLFW 窗口。 【参考方案1】:

好的,我已经找到解决办法了!

如果您遇到所有场景都结束的情况,则管理所有这些的线程将逐渐消失。为防止这种情况发生,请在 Platform.runLater 之前添加此行:

Platform.setImplicitExit(false);
Platform.runLater(()->System.out.println("Inside Platform.runLater()"));

只要在最后一个场景结束之前运行,它就会保持线程活着,并且不会遇到runLater()失败的问题!

【讨论】:

是的!那解决了它!谢谢。 这个解决方案似乎也解决了我的问题。 此解决方案解决了在菜单栏之间导航时在 JFXpanel 中反映 webview 内容更改的问题。谢谢。

以上是关于Javafx Platform.runLater 永远不会运行的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX 2:背景和 Platform.runLater 与任务/服务

JavaFX 使用 Platform.runLater 从另一个线程更新 TextArea

JavaFX UI 在事件侦听器中的 JavaFX 应用程序线程中冻结,但可与 Platform.runLater 一起使用

限制 javafx gui 更新

当DataInputStream处于while循环时,JavaFX GUI卡住了

JavaFx监听serversocket并根据输入更新UI遇到了问题