Introdução ao JavaFX em Clojure

ClojureFX

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-nowrun-laterPara 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 .

Outros links