Clojure JavaFX - Toolkit Not Initialized错误

时间:2015-01-25 19:09:57

标签: clojure javafx

JavaFX 8,Java 1.8.0_31,Windows 7 x64

我在Clojure中有一个最小的JavaFX程序。 (ns...)子句可以导入所需的Java包,但 javafx.scene.control中的类除外,例如ButtonTextField等。< / p>

初始化工具包后,我必须为这些导入。 为什么我不能在初始化工具包之前导入这些类?我实际上还没有创建任何对象......所以我猜测JFX在某种程度上是在做某事导入这些类时的背景,首先需要初始化。下面是我的完整lein项目(从我看到这个问题的实际应用程序中最小化,并且没有清理JFX语法的所有漂亮的宏):

档案project.clj

(defproject jfx-so "0.1.0-SNAPSHOT"
  :dependencies [[org.clojure/clojure "1.6.0"]]
  :main jfx-so.core)

档案src/jfx_so/core.clj

(ns jfx-so.core
  (:import [javafx.scene Scene]
           [javafx.scene.layout BorderPane]
           [javafx.stage Stage]))

(defonce force-toolkit-init (javafx.embed.swing.JFXPanel.))         

;; For some reason the following must be imported after initting the toolkit
(import  [javafx.scene.control Button])

(defn -main [& args]
  (javafx.application.Platform/runLater
   #(doto (Stage.)
      (.setScene (Scene. (BorderPane. (Button. "Hello"))))
      (.show))))

谢谢! :)

1 个答案:

答案 0 :(得分:3)

我没有遇到过这个问题。也许这与你的defonce有关? 我先做我的进口。但是我确保在实施任何FX类之前启动FX-envoronment。所以在你的-main-method之后我会把:

(defn -main [& args] 
  ;;body here
  )
;; initialze the environement
(javafx.embed.swing.JFXPanel.)
;; ensure I can keep reloading and running without restarting JVM every time
(javafx.application.Platform/setImplicitExit false)

;; then
(-main)

希望这有帮助。