在Clojure中编写JavaFX项目

时间:2016-09-11 23:03:18

标签: javafx clojure leiningen

我正在尝试了解如何正确设置JavaFX以使用Clojure项目。通过阅读各种来源,这就是我想出的:

这是project.clj:

(defproject cljfx "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.8.0"]]
  :resource-paths ["lib/jfxrt.jar"]
  :main ^:skip-aot cljfx.core
  :target-path "target/%s"
  :profiles {:uberjar {:aot :all}})

我不知道是否应该使用:resource-paths或通过:dependencies vector将JavaFX添加到类路径...

这是core.clj:

我基本上已经将Clojure翻译成了本教程的一个例子:

http://docs.oracle.com/javafx/2/get_started/hello_world.htm

(ns cljfx.core
  (:gen-class
    :extends javafx.application.Application)
  (:import
    [javafx.application Application]
    [javafx.stage Stage]
    [javafx.scene Scene]
    [javafx.scene.control Button]
    [javafx.scene.layout StackPane]
    [javafx.event ActionEvent EventHandler]))


(defn -main [& args]
  (Application/launch cljfx.core args))

(defn button [text]
  (doto (Button.)
    (.setText (str "Say " text))
    (.setOnAction (proxy [EventHandler] []
                    (handle [event]
                      (println text))))))

(defn -start [primaryStage]
  (let [root (doto (StackPane.)
               (-> (.getChildren)
                   (.add (button "Hello World!"))))]
    (doto primaryStage
      (.setScene (Scene. root 300 250))
      (.show))))

这不编译,我不知道我做错了什么......你能帮助我吗?

这是错误: http://pastebin.com/sYeK7MJd

1 个答案:

答案 0 :(得分:2)

可能还有其他问题,但是pastebin日志中的根问题是:

Caused by: clojure.lang.ArityException: Wrong number of args (2) passed to: core/-start

使用gen-class和提供方法实现时,每个方法都需要将实例本身作为第一个参数。惯例是使用"这":

(defn -start [this primaryStage] 

尝试这一点,并确保将本地实例方法调用应用于"此"。