2016-09-11 47 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? –