【问题标题】:Why does importing javafx.scene.control.Button fail with Toolkit Not Initialized?为什么导入 javafx.scene.control.Button 会因 Toolkit Not Initialized 而失败?
【发布时间】:2014-05-04 22:58:14
【问题描述】:

我正在 Windows 7 上的 Java8 64 位 (1.8.0_05-b13) 上尝试使用带有 Clojure 的 JavaFX 的基本内容。

在我的导入中(无论是在 .clj 文件中还是在 REPL 中),我可以 (import 'javafx.scene.control.ButtonBuilder)(和其他构建器),但我不能 (import 'javafx.scene.control.Button) 或来自 javax.scene.control 的任何其他最终小部件。

如果我尝试导入 javafx.scene.control.Button 或其他小部件,我会收到 Toolkit Not Initialized 错误。与尝试通过 ButtonBuilder 创建按钮相同,即使 ButtonBuilder 类本身似乎工作正常,而且我似乎完全能够从 javafx 层次结构中导入其他内容。

为了让它工作,我必须强制工具包初始化,如此处所示,我认为这会在某处留下一个孤立面板,感觉有点脏:https://gist.github.com/zilti/6286307

(ns hello.core
  (:import (javafx.event ActionEvent EventHandler)
           (javafx.scene Scene SceneBuilder)
           (javafx.scene.layout VBox VBoxBuilder)
           ;;(javafx.scene.control Button) -- MUST COMMENT THIS OUT OR FAIL
           (javafx.scene.control ButtonBuilder)
           (javafx.stage Stage StageBuilder)))

(defonce force-toolkit-init (javafx.embed.swing.JFXPanel.))

Java 7 和 javafxrt.jar 并非如此。我发现的关于这个的唯一讨论(在 SO 上)表明这是 Swing 互操作所必需的,我没有使用它。

有人可以解释一下为什么现在 Java8 需要这样做,以及为什么它似乎只需要像 Button 这样的最终小部件?

这看起来像是一个神奇的解决方法。有什么真正的解决方案吗?

【问题讨论】:

    标签: swing clojure javafx-2 javafx-8


    【解决方案1】:

    JavaFX 需要启动 UI 线程、处理应用程序运行模式和加载本地库的初始化代码。

    强烈建议 JavaFX 应用程序从扩展 javafx.appication.Application 的类开始,该类将执行所有初始化例程。

    调用 JFXPanel 也会执行初始化,但它有点 hack(除非你真的在一个应用程序中使用 swing 和 FX)。

    【讨论】:

    • 所以其他的东西似乎工作的事实,有点像主窗口打开,基本上是一个未定义的,但仍然有用的行为?我以前使用 :gen-class 方法从 Application 派生,但我想看看我是否可以对 GUI 进行 REPL 控制。到目前为止,我可以创建小部件(在初始化之后),但是当我关闭窗口时,我无法再次启动它。这实际上是主要目标,将启动时间减少到可以忽略不计的时间。
    • 是的,你原来的方法更正确。关于无法再次启动 Windows,最好在另一个问题中询问更多详细信息。
    猜你喜欢
    • 2014-12-19
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 2011-04-30
    • 2020-10-14
    • 1970-01-01
    相关资源
    最近更新 更多