Si lee JavaFX Application class documentation, verá que la clase de aplicación es una clase abstracta, que no puede crearse una instancia directamente. Eso significa que, al menos, tiene que crear una subclase de javafx.application.Application.
del ciclo de vida
El punto de entrada para aplicaciones JavaFX es la clase de aplicación. El JavaFX tiempo de ejecución hace lo siguiente, en orden, cada vez que se inicia una aplicación :
- construye una instancia de la clase de la aplicación especificada
- Llama al método init()
- Llama al inicio (javafx. stage.Stage) método
- Espera a que finalice la aplicación, que ocurre cuando ocurre cualquiera de las siguientes : la aplicación llama a Platform.exit() la última ventana ha sido cerrada y el atributo implicitExit en la plataforma es verdadero. Llama al método stop() Tenga en cuenta que el método de inicio es abstracto y debe ser anulado.
Por lo tanto es necesario generar una clase - con ayuda de la macro-Gen clase, ya que se puede ver en la entrada del blog - con un método de inicio para poder iniciar la aplicación.
Editar: Enlace a la aplicación de ejemplo utilizando el enfoque gen-class agregado
He creado un Github repository with a simple example JavaFX application in Clojure. aquí es el archivo de Clojure siguiendo el enfoque de clase 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 [])))
El jfx.app espacio de nombres tiene que ser compilado para iniciar la aplicación, esto no funcionará si se ejecuta el código en el REPL directamente. Si desea probar el código, siga las instrucciones para configurar JavaFX con Maven y Leiningen en el project's README.md file.
¿Cómo se lanza el repl? Debido a la dependencia del tiempo de ejecución de JavaFX, el jfxrt.jar debe estar en el classpath. ¿Creó un proyecto usando Leiningen? –