javafx-2 - JavaFX 2.1 : Toolkit not initialized

标签 javafx-2

我的应用程序是基于 Swing 的。我想介绍 JavaFX 并将其配置为在辅助显示器上渲染场景。 我可以使用 JFrame 来容纳 JFXPanel,而 JFXPanel 可以容纳 JFXPanel,但我想使用 JavaFX API 来实现这一点。

子类化 com.sun.glass.ui.Application 并使用 Application.launch(this) 不是一个选项,因为调用线程将被阻塞。

当从 Swing EDT 实例化阶段时,我得到的错误是:

java.lang.IllegalStateException: Toolkit not initialized

有什么指点吗?

<小时/>

编辑:结论

问题:重要的 Swing GUI 应用程序需要运行 JavaFX 组件。应用程序的启动过程在启动依赖的服务层后初始化 GUI。

解决方案

子类化 JavaFX 应用程序类并在单独的线程中运行它,例如:

public class JavaFXInitializer extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        // JavaFX should be initialized
        someGlobalVar.setInitialized(true);
    }
}

旁注:因为 Application.launch() 方法采用 Class<? extends Application>作为参数,必须使用全局变量来表示 JavaFX 环境已初始化。

替代方法:在 Swing 事件调度程序线程中实例化 JFXPanel:

final CountDownLatch latch = new CountDownLatch(1);
SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        new JFXPanel(); // initializes JavaFX environment
        latch.countDown();
    }
});
latch.await();

通过使用这种方法,调用线程将等待,直到 JavaFX 环境设置完毕。

选择您认为合适的任何解决方案。我选择了第二个,因为它不需要全局变量来指示 JavaFX 环境的初始化,而且也不会浪费线程。

最佳答案

找到了解决方案。如果我只是在调用 JavaFX Platform.runLater 之前从 Swing EDT 创建一个 JFXPanel,它就可以工作。 我不知道这个解决方案是否可靠,如果结果不稳定我可能会选择 JFXPanel 和 JFrame。

public class BootJavaFX {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new JFXPanel(); // this will prepare JavaFX toolkit and environment
                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                        StageBuilder.create()
                                .scene(SceneBuilder.create()
                                        .width(320)
                                        .height(240)
                                        .root(LabelBuilder.create()
                                                .font(Font.font("Arial", 54))
                                                .text("JavaFX")
                                                .build())
                                        .build())
                                .onCloseRequest(new EventHandler<WindowEvent>() {
                                    @Override
                                    public void handle(WindowEvent windowEvent) {
                                        System.exit(0);
                                    }
                                })
                                .build()
                                .show();
                    }
                });
            }
        });
    }
}

关于javafx-2 - JavaFX 2.1 : Toolkit not initialized,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58943214/

相关文章:

java - 无法在 JavaFX 组合框中转换对象

javafx-2 - 如何使用JavaFX播放mp3片段?

JavaFX:拉伸(stretch)选项卡以适应父 TabPane

webview - 阻止/禁用 JavaFX 2 WebView 右键单击

java - 在单元测试中等待 Platform.RunLater

java - 比较 2 个日期 javafx

java - FXML 加载异常

JavaFX:如何更改焦点遍历策略?

clojure - 来自 Clojure repl 的 JavaFX