我正在尝试使用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这样的最终小部件?
这看起来像一个神奇的解决方法。某种方式有没有真正的解决方案?
答案 0 :(得分:1)
JavaFX需要初始化代码,它启动UI线程,处理应用程序运行模式并加载本机库。
强烈建议JavaFX应用程序从扩展javafx.appication.Application
的类开始,该类将执行所有初始化例程。
调用JFXPanel
也会执行初始化,但它有点黑客攻击(除非你真的在一个应用程序中使用swing和FX)。