JavaFX Application class documentationを読むと、Applicationクラスが抽象クラスであり、直接インスタンス化できないことがわかります。つまり、少なくともjavafx.application.Applicationのサブクラスを作成する必要があります。
ライフサイクル
JavaFXアプリケーションのエントリポイントは、Applicationクラスです。 のJavaFXランタイムはアプリケーション が起動されるたびに、順番に、次の処理を行います。
- は
- がスタート(JavaFXのコールのinit()メソッドを呼び出し、指定Applicationクラス
- のインスタンスを構築します。 stage.Stage)メソッド
- のいずれかが発生したときにアプリケーションが終了するのを待機します。最後のウィンドウが終了したPlatform.exit()が呼び出されました が閉じられ、PlatformのimplicitExit属性がtrueです。 stop()メソッドstartメソッドは抽象メソッドであり、 をオーバーライドする必要があることに注意してください。
したがって、あなたは、クラスを生成する必要がある - それはブログ記事に見られるようにGEN-クラスのマクロを使用して - startメソッドを使用してアプリケーションを起動できるようにします。
編集:gen-classアプローチを使用したサンプルアプリケーションへのリンク
私はGithub repository with a simple example JavaFX application in Clojureを作成しました。ここではClojureのファイルがGEN-クラスのアプローチ以下の通りです:
(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を使用してプロジェクトを作成しましたか? –