Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure can';t使用静态初始值设定项导入JavaFX类_Clojure_Javafx_Javafx 8 - Fatal编程技术网

Clojure can';t使用静态初始值设定项导入JavaFX类

Clojure can';t使用静态初始值设定项导入JavaFX类,clojure,javafx,javafx-8,Clojure,Javafx,Javafx 8,我在玩Clojure(1.6)和JavaFX8,一开始我就遇到了一个问题。例如,这段非常简单的代码失败了: (ns xxyyz.core) (gen类:名称“xxyyzz.core.App” :扩展javafx.application.application :前缀“app-”) (defn应用程序启动[应用程序阶段] (let[button(javafx.scene.control.button.))) (defn发布[] (javafx.application.application/lau

我在玩Clojure(1.6)和JavaFX8,一开始我就遇到了一个问题。例如,这段非常简单的代码失败了:

(ns xxyyz.core)
(gen类:名称“xxyyzz.core.App”
:扩展javafx.application.application
:前缀“app-”)
(defn应用程序启动[应用程序阶段]
(let[button(javafx.scene.control.button.)))
(defn发布[]
(javafx.application.application/launch xxyyz.core.App(放入数组字符串[])
(defn-main[]
(发射)
这是堆栈跟踪的最后一个相关部分:

原因:java.lang.ExceptionInInitializeError
位于java.lang.Class.forName0(本机方法)
位于java.lang.Class.forName(Class.java:340)
位于clojure.lang.RT.classForName(RT.java:2070)
位于clojure.lang.Compiler$HostExpr.maybeClass(Compiler.java:969)
位于clojure.lang.Compiler$HostExpr.access$400(Compiler.java:747)
位于clojure.lang.Compiler$NewExpr$Parser.parse(Compiler.java:2494)
位于clojure.lang.Compiler.analyzeSeq(Compiler.java:6560)
... 48多
原因:java.lang.IllegalStateException:工具箱未初始化
位于com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:276)
位于com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:271)
位于com.sun.javafx.application.PlatformImpl.setPlatformUserAgentStylesheet(PlatformImpl.java:562)
位于com.sun.javafx.application.PlatformImpl.setDefaultPlatformUserAgentStylesheet(PlatformImpl.java:524)
位于javafx.scene.control.control.(control.java:81)
... 55多
我一点也不说Java,但研究这个问题,似乎问题在于Clojure及其导入Java类的方式。如果我理解正确,在导入时它运行类静态初始值设定项,对于一些崩溃的JavaFX类(
按钮)

我想我有两个问题:我对这个错误的理解正确吗?第二,有没有办法解决这个问题?我试着在函数内部拉导入,而不是在(ns)声明中,但仍然不起作用

如果没有Clojure修复程序,是否可以使用一些额外的Java代码来修复


欢迎任何提示和指点

我找不到改变Clojure导入行为的方法,但我确实找到了一些方法来做我需要的事情

首先,JavaFX提供了生成器类,因此在这种特殊情况下,最干净的方法是使用
ButtonBuilder
创建新按钮

第二种方法是编写一个简单的Java类来包装
按钮
,然后从Clojure的侧面导入包装类。当处理数量较少的问题类时,这是一个不错的解决方案

第三种方法是在运行时导入,类似这样(多亏了#clojure的同事们的帮助):

最后,这似乎是Clojure的Java互操作中的一个丑陋的缺点,如果将来能够修复它,那就太好了


更新:也有,但不幸的是,从Clojure 1.6开始,它不是公开的。不过,在Clojure中重新实现它很容易:

(fn [^String class-name]
  (Class/forName class-name false (clojure.lang.RT/baseLoader)))
稍后,可以使用
clojure.lang.Reflector/invokeConstructor
实例化该类

(fn [^String class-name]
  (Class/forName class-name false (clojure.lang.RT/baseLoader)))