Gram w Clojure (1.6) i JavaFX 8, i od samego początku napotkałem problem. Na przykład, to bardzo prosty kod zawiedzie:Clojure nie może importować klas JavaFX za pomocą inicjalizatorów statycznych.
(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))
Jest to ostatnia część śladu stosu, który wydaje stosowne:
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
nie mówię Java w ogóle, ale badanie to wydaje że problem leży w Clojure i sposobie, w jaki importuje klasy Java. Jeśli rozumiem poprawnie, w czasie importu uruchamia inicjalizator statyczny klasy, a dla niektórych klas JavaFX (Button
w moim przypadku) ulega awarii.
Zgadnij Mam dwa pytania: czy moje zrozumienie tego błędu jest prawidłowe? Po drugie, czy istnieje jakiś sposób obejścia tego problemu? Próbowałem ciągnięcie importu wewnątrz funkcji zamiast na deklaracji (ns), ale nadal nie działa.
Jeśli nie ma poprawki Clojure, czy można to naprawić za pomocą dodatkowego kodu Java?
Wszelkie wskazówki i wskazówki są mile widziane!