如果您閱讀JavaFX Application class documentation,您將看到Application類是一個抽象類,不能直接實例化。這意味着,你至少必須創建一個javafx.application.Application的子類。
生命週期
的入口點JavaFX應用程序是應用程序類。所述 JavaFX運行將執行以下操作,以便,每當應用 啓動:
- 構造指定的應用程序類
- 的實例調用init()方法
- 呼叫開始(JavaFX的。 stage.Stage)方法
- 等待應用程序來完成,當發生以下任一 的這恰好:應用程序調用Platform.exit()的最後一個窗口已關閉 和平臺的implicitExit屬性爲true調用 stop()方法請注意,啓動方法是抽象的,必須重寫 。
因此,你需要生成一個類 - 使用GEN-類的宏,因爲它可以在博客文章中可以看出 - 一個start方法可以啓動應用程序。
編輯:使用gen-class方法添加鏈接到示例應用程序
我創建了一個Github repository with a simple example JavaFX application in Clojure。這裏是繼根類方法Clojure的文件:
(ns jfx.app
(:import (javafx.beans.value ChangeListener ObservableValue)
(javafx.concurrent Worker$State)
(javafx.event ActionEvent EventHandler)
(javafx.scene Scene)
(javafx.scene.control Button)
(javafx.scene.layout StackPane)
(javafx.stage Stage)
(javafx.scene.web WebView)))
(gen-class
:name clj.jfx.App
:extends javafx.application.Application
:prefix "app-")
(defn app-start [app ^Stage stage]
(let [root (StackPane.)
btn (Button.)
web-view (WebView.)
state-prop (.stateProperty (.getLoadWorker (.getEngine web-view)))
url "http://clojure.org"]
;; Add a WebView (headless browser)
(.add (.getChildren root) web-view)
;; Register listener for WebView state changes
(.addListener state-prop
(proxy [ChangeListener] []
(changed [^ObservableValue ov
^Worker$State old-state
^Worker$State new-state]
(println (str "Current state:" (.name new-state)))
(if (= new-state Worker$State/SUCCEEDED)
(println (str "URL '" url "' load completed!"))))))
;; Load a URL
(.load (.getEngine web-view) url)
;; add a Button with a click handler class floating on top of the WebView
(.setTitle stage "JavaFX app with Clojure")
(.setText btn "Just a button")
(.setOnAction btn
(proxy [EventHandler] []
(handle [^ActionEvent event]
(println "The button was clicked"))))
(.add (.getChildren root) btn)
;; Set scene and show stage
(.setScene stage (Scene. root 800 600))
(.show stage)))
(defn app-stop
"Stop method is called when the application exits."
[app]
(println "Exiting application!")
)
(defn launch
"Launch a JavaFX Application using class clj.jfx.App"
[]
(javafx.application.Application/launch clj.jfx.App (into-array String [])))
的jfx.app命名空間有,如果你在REPL直接運行的代碼被編譯到啓動應用程序,這是不行的。如果您想嘗試這些代碼,請按照說明在project's README.md file中使用Maven和Leiningen設置JavaFX。
你如何啓動repl?由於JavaFX運行時依賴關係,jfxrt.jar必須位於類路徑中。你使用Leiningen創建了一個項目嗎? – 2012-08-18 13:39:37