为什么导入javafx.scene.control.Button失败并且Toolkit未初始化?

时间:2014-05-04 22:58:15

标签: swing clojure javafx-2 javafx-8

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

在我的导入中(无论是在.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 heirarchy导入其他东西。

为了让它工作,我必须强制工具包进行初始化,如图所示,我认为我在某个地方留下了一个孤立面板,感觉有点脏: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这样的最终小部件?

这看起来像一个神奇的解决方法。某种方式有没有真正的解决方案?

1 个答案:

答案 0 :(得分:1)

JavaFX需要初始化代码,它启动UI线程,处理应用程序运行模式并加载本机库。

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

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