【发布时间】:2014-04-29 13:00:54
【问题描述】:
我在玩 Clojure (1.6) 和 JavaFX 8,一开始我就遇到了问题。例如,这个非常简单的代码失败了:
(ns xxyyzz.core)
(gen-class :name "xxyyzz.core.App"
:extends javafx.application.Application
:prefix "app-")
(defn app-start [app stage]
(let [button (javafx.scene.control.Button.)]))
(defn launch []
(javafx.application.Application/launch xxyyzz.core.App (into-array String [])))
(defn -main []
(launch))
这是堆栈跟踪中似乎相关的最后一部分:
Caused by: java.lang.ExceptionInInitializerError
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:340)
at clojure.lang.RT.classForName(RT.java:2070)
at clojure.lang.Compiler$HostExpr.maybeClass(Compiler.java:969)
at clojure.lang.Compiler$HostExpr.access$400(Compiler.java:747)
at clojure.lang.Compiler$NewExpr$Parser.parse(Compiler.java:2494)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6560)
... 48 more
Caused by: java.lang.IllegalStateException: Toolkit not initialized
at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:276)
at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:271)
at com.sun.javafx.application.PlatformImpl.setPlatformUserAgentStylesheet(PlatformImpl.java:562)
at com.sun.javafx.application.PlatformImpl.setDefaultPlatformUserAgentStylesheet(PlatformImpl.java:524)
at javafx.scene.control.Control.<clinit>(Control.java:81)
... 55 more
我根本不会说 Java,但研究这个问题似乎在于 Clojure 及其导入 Java 类的方式。如果我理解正确,在导入时它会运行类静态初始化程序,并且对于某些 JavaFX 类(在我的情况下为 Button)会崩溃。
我想我有两个问题:我对这个错误的理解正确吗?其次,有没有办法以某种方式解决这个问题?我已经尝试在 (ns) 声明中拉取函数内部的导入,但它仍然不起作用。
如果没有 Clojure 修复,是否可以通过一些额外的 Java 代码来修复?
欢迎任何提示和指点!
【问题讨论】: