Руководство | API docs | Исходный код | Журнал изменений | Лицензия
Качество Beta — API достаточно стабилен и прошёл значительное тестирование. Требуется JDK 8 и как минимум Clojure 1.7.0-alpha3.
Библиотека Clojure для JavaFX 8 со следующими целями:
(fx/h-box (fx/button "Hello World"))
, так и с использованием API, подобного hiccup — (fx/compile-fx [:h-box [:button "Hello World"]])
.Убедитесь, что вы установили JDK 8 (http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html) и настроили lein для его использования. См. пример проекта leiningen (https://github.com/technomancy/leiningen/blob/master/sample.project.clj) и найдите LEIN_JAVA_CMD, :java-cmd и JAVA_CMD для ознакомления с различными способами сделать это.
Добавьте зависимость leiningen в свой проект, указанный выше, и объявление пространства имён, подобное следующему, в свой код:
(ns my-ns
(:require [fx-clj.core :as fx]))
Пример «Hello world»:
(ns example
(:require [fx-clj.core :as fx]))
(defn create-view []
(fx/h-box
(fx/button {:on-action (fn [e] (println "Hello World!"))
:text "Click Me!"})))
(fx/sandbox #'create-view) ;; Создаёт окно «песочницы» JavaFX для
;; отображения представления. Нажатие F5 в этом
;; окне обновит представление, позволяя обновить
;; функцию create-view в REPL
Быстрый пример интеграции fx-clj и core.async:
(ns example2
(:require [fx-clj.core :as fx])
(:require [clojure.core.async :refer [chan go <! >!]]))
(defn create-view []
(let [click-ch (chan)
btn (fx/button :#my-btn {:on-action click-ch ;; Вы можете привязать канал core.async непосредственно к событию
:text "Next"})
txt (fx/text "Initial text")
view (fx/v-box txt btn)]
(go
(<! click-ch)
(fx/run<! (fx/pset! txt "Next text"))
(<! click-ch)
(fx/run<!
(fx/pset! txt "Last text")
(fx/pset! btn {:text "Done"}))
(println "Done listening to clicks"))
view))
(fx/sandbox #'create-view)
Существует три макроса для взаимодействия с потоком приложения JavaFX — каждый обеспечивает немного разное асинхронное поведение: run!, run<! и run<!!. Для тех, кто знаком с core.async, они соответствуют поведению put!, <! и <!! соответственно.
run! отправляет блок кода для асинхронного выполнения в потоке приложения JavaFX, не блокируя вызывающую сторону. (Это фактически тонкая оболочка вокруг javafx.application.Platform/runLater.)
(run! (do-something)) ;; запустить асинхронно без блокировки
run<! можно использовать только в блоке core.async go! Он использует канал core.async и <! для возврата значения кода, выполненного в потоке приложения JavaFX, вызывающей стороне в блоке go. (Этот блок блокирует, но не блокирует поток.)
(go
(let [res (run<! (do-something))] ;; Go block приостановлен
(println res)))
``` **Использование run<!!**
run<!! использует канал core.async и <!! для возврата значения кода, выполняемого в потоке приложения JavaFX. Он блокирует вызывающий поток до завершения блока и возвращает его значение вызывающей стороне.
```clojure
(let [res (run<!! (do-something))] ;; Вызывающий поток заблокирован
(println res)))
Модификация объектов JavaFX
Функция pset! используется для модификации объектов JavaFX.
Подпись для pset!:
(defn pset! [element id-class-keyword? property-map? content-or-children*])
id-class-kw? (необязательно): ключевое слово, представляющее идентификатор и классы в стиле hiccup (например, :#some-id.some-class.another-class
).
property-map? (необязательно): карта свойств и сеттеров. Ключи могут быть ключевыми словами в стиле kebab-case, соответствующими свойствам компонента JavaFX bean. Значения преобразуются с помощью clojurefx.core.convert/convert-arg. Если значение является экземпляром ObservableValue (или преобразуется в него), оно будет привязано к свойству.
content-or-children* (ноль или более): элемент или элементы, которые будут связаны со свойством DefaultProperty элемента JavaFX. Если свойство DefaultProperty является списком, можно связать несколько дочерних элементов, в противном случае можно связать только один элемент «content».
Создание объектов JavaFX
Существует как функциональный API, так и API в стиле hiccup для создания объектов JavaFX.
См. документацию по API для fx-clj.core для получения списка поддерживаемых объектов JavaFX.
Синтаксис для всех функций создания объектов и векторов в стиле hiccup идентичен синтаксису pset! после первого аргумента (для целевого элемента). Выбор между различными стилями в основном зависит от предпочтений. Все следующие варианты эквивалентны:
(fx/button :#my-btn.my-class {:on-action (fn [] (println "Clicked"))} "Click Me")
(fx/compile-fx [:button#my-btn.my-class {:on-action (fn [] (println "Clicked"))}] "Click Me")
(fx/pset! (Button.) :#my-btn.my-class {:on-action (fn [] (println "Clicked"))} "Click Me")
Поскольку DefaultProperty кнопки — это текст, его можно установить, передав один аргумент после карты свойств.
Элементы также можно определить с помощью FXML и изменить с помощью преобразования на основе селектора (вроде enlive) с использованием функции at!. В настоящее время поддерживаются только селекторы на основе идентификаторов. Также поддерживаются преобразования на основе pset!, а также ограниченное количество других преобразований. См. тестовый пример (https://github.com/aaronc/fx-clj/blob/master/test/fx_clj/example_enlive.clj).
Привязка данных
Реактивные атомы, выражения и курсоры из freactive.core можно привязать к любому свойству JavaFX. К сожалению, не все эти возможности полностью задокументированы — см. пространство имён fx-clj.core.binding (которое включено в fx-clj.core с помощью potemkin) для получения дополнительной информации.
Copyright © 2014 Aaron Craelius
Распространяется под лицензией Eclipse Public License версии 1.0 или (по вашему выбору) любой более поздней версии.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )