Pré-requisitos
A JVM, Leiningen , Maven e o jfxrt.jar (descrito abaixo)
O jfxrt.jar
Primeiro, temos que localizar o jfxrt.jar, pois ele não está por padrão no caminho de classe. Se você estiver usando Windows ou OS X ou usar o Oracle JVM no Linux, é simples de localizar; Ele está dentro da pasta lib do diretório JRE.
Para OpenJDK, você precisará do JavaFX Scene Builder 1.1 Developer Preview e instalar o jfxrt.jar fornecido. Você provavelmente terá que copiar toda a pasta lib distribuída com o Scene Builder e substituir parcialmente o OpenJDK.
Agora use o seguinte comando para adicionar JavaFX ao seu repositório Maven local e substitua $ JFXRTPATH pelo caminho para a pasta lib do JRE:
mvn install:install-file \
-Dfile=$JFXRTPATH/jfxrt.jar \
-DgroupId=com.oracle \
-DartifactId=javafx-runtime \
-Dpackaging=jar \
-Dversion=2.2.0
Agora você pode referenciá-lo em suas dependências Leiningen com
[com.oracle/javafx-runtime "2.2.0"]
O código
Em primeiro lugar, devo dizer que o pessoal da Oracle realmente fez um ótimo trabalho projetando a API. É muito mais simples de usar e parece quase nativo no Clojure, especialmente ao usar as classes * Builder.
mas existem algumas coisas que você deseja fazer antes de usá-lo:
- Não use javafx.application.Application. Isso significaria estender uma aula e, felizmente, não é necessário. Basta adicionar esta linha ao seu código:
(defonce force-toolkit-init (javafx.embed.swing.JFXPanel.))
- Crie um atalho para Platform.runLater. Na verdade, isso vai economizar muito com o trabalho de digitação:
(defn run-later*
[f]
(javafx.application.Platform/runLater f))
(defmacro run-later
[& body]
`(run-later* (fn [] ~@body)))
(defn run-now*
[f]
(let [result (promise)]
(run-later
(deliver result (try (f) (catch Throwable e e))))
@result))
(defmacro run-now
[& body]
`(run-now* (fn [] ~@body)))
(defn event-handler*
[f]
(reify javafx.event.EventHandler
(handle [this e] (f e))))
(defmacro event-handler [arg & body]
`(event-handler* (fn ~arg ~@body)))
(Trechos de código emprestados da biblioteca de resultados finais abandonada )
Aplicativo de exemplo Veja esta essência para um pequeno aplicativo hello-world compatível com REPL (!) (Incluindo project.clj).
Como sei quando devo usar / ?
run-now
run-later
Para começar, é necessário para Palco e Cena. Além disso, você receberá uma “IllegalStateException Not on FX application thread” se tiver algum código que pertença a um run-now ou run-later.Existe uma biblioteca desenvolvida ativamente? Provavelmente irei trabalhar em um em breve, caso dependa do JavaFX para meu próximo projeto. Comecei a escrever um pequeno wrapper com funções de conveniência; Você pode encontrar aqui .