1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/ellipse-mistlibs.fx-clj

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Руководство | API docs | Исходный код | Журнал изменений | Лицензия

Проект Clojars

Качество Beta — API достаточно стабилен и прошёл значительное тестирование. Требуется JDK 8 и как минимум Clojure 1.7.0-alpha3.

Обзор

Библиотека Clojure для JavaFX 8 со следующими целями:

  • Предоставить удобные функции для создания и изменения объектов JavaFX без попытки полностью скрыть API JavaFX.
  • Работать с core.async «из коробки».
  • Обеспечить поддержку создания объектов JavaFX как с помощью функционального подхода — (fx/h-box (fx/button "Hello World")), так и с использованием API, подобного hiccup — (fx/compile-fx [:h-box [:button "Hello World"]]).
  • Предоставить API для модификации узлов с помощью селекторов (вроде enlive) для взаимодействия с ресурсами FXML.
  • Позволить устанавливать CSS JavaFX из кода и интегрироваться с библиотекой garden CSS.
  • Вспомогательные функции для i18n.
  • Обеспечить привязку данных к реактивным атомам, курсорам и выражениям (через freactive.core).

Быстрый старт

Убедитесь, что вы установили 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

Существует три макроса для взаимодействия с потоком приложения 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 )

Вы можете оставить комментарий после Вход в систему

Введение

Библиотека Clojure для JavaFX на основе fx-clj. Развернуть Свернуть
EPL-1.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/ellipse-mistlibs.fx-clj.git
git@api.gitlife.ru:oschina-mirror/ellipse-mistlibs.fx-clj.git
oschina-mirror
ellipse-mistlibs.fx-clj
ellipse-mistlibs.fx-clj
master