2016-09-11 42 views
1

我想了解如何正確設置JavaFX與Clojure項目一起工作。通過閱讀各種來源,這是我想出:在Clojure中編寫JavaFX項目

這是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}}) 

我不知道我是否應該使用:資源路徑或添加的JavaFX到classpath通過:依賴矢量...

這是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

回答

2

可能有其他的問題,但在引擎收錄日誌中的根本問題是:

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

當使用根級和提供方法實現方式中,每個方法需要將實例本身作爲第一個參數。慣例是使用「this」:

(defn -start [this primaryStage] 

嘗試一下,並確保本地實例方法調用應用於「this」。

+1

我的不好,我不知道......但是你用本地實例方法是什麼意思?應該主要有[this&args]而不是[&args]?我注意到,將「this」添加到-start會使其起作用,但我無法在-main中使用它來代替cljfx.core,可以嗎? –

+1

不,主要是一個公共靜態,就像一個全局函數。它所在的命名空間在project.clj中指定。開始,otoh是一個應用程序實例方法。它只能看到特定的實例或複製類Application中可用的字段。無論如何,這可能需要的其他地方是處理方法,它可能需要(處理[此事件] ...因爲正在創建的是EventHandler的一個實例。 –

+1

嗯沒關係... project.clj?我仍然不能用'lein run'編譯這個項目(它會拋出一個ClassNotFound異常與cljfx.core ...怪異的),但是如果我構建uberjar然後將它作爲一個java程序來運行,它就可以工作。 。我應該使用:resource-paths還是:依賴項來添加javafx? –