Каков наилучший способ сделать GUI в Clojure?
-
04-07-2019 - |
Вопрос
Как лучше всего создавать графические интерфейсы в Clojure ?
Есть ли пример некоторых функциональных Swing или SWT оболочка? Или некоторая интеграция с JavaFX декларативным описанием графического интерфейса, которое можно легко поместить в s-выражения с использованием некоторой макрологии?
Есть учебники?
Решение
Я смиренно предложу качели . Р>
Вот учебник на основе REPL , в котором не требуется знание Java или Swing.
<Ч>Seesaw очень похож на то, что предлагает @tomjen. Вот вам "Hello, World":
(use 'seesaw.core)
(-> (frame :title "Hello"
:content "Hello, Seesaw"
:on-close :exit)
pack!
show!)
и вот пример @Abhijith и @ dsm, переведенный буквально:
(ns seesaw-test.core
(:use seesaw.core))
(defn handler
[event]
(alert event
(str "<html>Hello from <b>Clojure</b>. Button "
(.getActionCommand event) " clicked.")))
(-> (frame :title "Hello Swing" :on-close :exit
:content (button :text "Click Me" :listen [:action handler]))
pack!
show!)
Другие советы
Стюарт Сьерра недавно опубликовал серию постов в блоге по GUI-разработке с clojure (и swing). Начните здесь: http://stuartsierra.com/2010/ 01/02 / первоклассников шаги-с-Clojure-качели
Если вы хотите заниматься программированием с помощью графического интерфейса, я бы указал на преобразователь температуры или колония муравьев .
Многие вещи в Swing выполняются подклассами, особенно если вы создаете пользовательские компоненты. Для этого есть две основные функции / макросы: прокси и gen-class .
Теперь я понимаю, куда ты идешь с Лиспой. Я не думаю, что есть что-то подобное еще. Я бы настоятельно рекомендовал не пытаться создать грандиозную среду построения GUI а-ля CLIM , но что-то делать подробнее Lispy: начните писать свое приложение Swing и абстрагируйте ваши общие шаблоны с помощью макросов. При этом у вас может быть язык для написания графического интерфейса пользователя, или, может быть, какой-то очень общий материал, которым можно делиться и расти.
Одна вещь, которую вы теряете при написании графического интерфейса в Clojure, - это использование таких инструментов, как Matisse. Это может быть убедительным указанием для написания некоторых частей на Java (GUI) и некоторых частей на Clojure (логика). Что на самом деле имеет смысл, так как в логике вы сможете создать язык для вашей логики с использованием макросов, и я думаю, что здесь есть что-то большее, чем с GUI. Очевидно, это зависит от вашего приложения.
Со этой страницы : р>
(import '(javax.swing JFrame JButton JOptionPane)) ;'
(import '(java.awt.event ActionListener)) ;'
(let [frame (JFrame. "Hello Swing")
button (JButton. "Click Me")]
(.addActionListener button
(proxy [ActionListener] []
(actionPerformed [evt]
(JOptionPane/showMessageDialog nil,
(str "<html>Hello from <b>Clojure</b>. Button "
(.getActionCommand evt) " clicked.")))))
(.. frame getContentPane (add button))
(doto frame
(.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)
.pack
(.setVisible true)))
print("code sample");
И, конечно же, стоило бы взглянуть на раздел совместимости веб-сайта Clojure.
Никто еще не предложил это, поэтому я буду: Браузер как платформа пользовательского интерфейса. Вы можете написать свое приложение на Clojure, включая HTTP-сервер, а затем разработать пользовательский интерфейс, используя что-либо от HTML до hiccup , ClojureScript и любой из миллиарды библиотек JS, которые вам нужны. Если вы хотите, чтобы в браузере было стабильное поведение и «настольное приложение выглядело», quot; Вы можете связать Chrome с вашим приложением .
Похоже, что Light Table распространяется.
В clojure contrib есть обертка для MigLayout. Вы также можете взглянуть на эту суть . Я в основном выкладываю любой код, который пишу, когда изучаю Swing / Miglayout.
Примерdsm переписан без лишних слов с помощью contrib.swing-utils
(ns test
(:import (javax.swing JButton JFrame))
(:use (clojure.contrib
[swing-utils :only (add-action-listener)])))
(defn handler
[event]
(JOptionPane/showMessageDialog nil,
(str "<html>Hello from <b>Clojure</b>. Button "
(.getActionCommand event) " clicked.")))
(let [ frame (JFrame. "Hello Swing")
button (JButton. "Click Me") ]
(add-action-listener button handler)
(doto frame
(.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)
(.add button)
(.pack)
(.setVisible true)))
в списке рассылки рассказывалось о нескольких ячейках ( а-ля ячейки Кенни Тилтона ). Это довольно удобный способ программирования с помощью графического интерфейса.
Я бы предпочел перейти на clojurefx, это немного преждевременно, но это работает и экономит ваше время.
Я запустил свой графический интерфейс с качелями, а затем попробовал другой компонент в clojurefx.
Я закончил оба, и я убежден, что я собираюсь реорганизовать качели в clojurefx.
В конце концов, JavaFX - это путь вперед.
Это легче, чем качели. Или, по крайней мере, писать это.
Привязки работают, слушатели работают, большинство компонентов работают, в противном случае, просто используйте один из макросов для создания конструктора для этого конкретного случая и выполненной работы. Или, если вам трудно, напишите несколько методов на Java и попросите помочь улучшить clojurefx.
Парень, который написал clojurefx, сейчас занят, но вы можете раскошелиться на проект и внести некоторые исправления.
Вот еще один очень простой пример свинга:
; time for some swing
(import '(javax.swing JFrame JTable JScrollPane))
(import '(javax.swing.table DefaultTableModel))
(let
[frame (JFrame. "Hello Swing")
dm (DefaultTableModel.)
table (JTable. dm)
scroll (JScrollPane. table)]
(doto dm
(.setNumRows 30)
(.setColumnCount 5))
(.. frame getContentPane (add scroll))
(doto frame
(.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)
(.pack)
(.setVisible true)))
Я задал себе тот же вопрос написания графического интерфейса в Clojure с Swing и предложил библиотеку signe а> р>
Он позволяет использовать представление вашей доменной модели в виде единой структуры данных Clojure, заключенной в атом. См. примеры здесь . р>
Я разрабатывал апплет Java, в котором все написано на Clojure, кроме кода апплета, написанного на Java. Апплет вызывает обратные вызовы кода Clojure для init, paint и т. Д. Из хуков java для тех методов, которые определены моделью апплета. Таким образом, код в конечном итоге составляет 99,999% Clojure, и вам по большей части не нужно думать о крошечной части Java. Р>
У этого подхода есть некоторые недостатки, которые я надеюсь обсудить более подробно в Clojure Google Group. Я думаю, что разработчики Clojure должны включать в себя собственный способ создания приложений. В настоящее время вы можете делать все, что вам нравится в GUI, из REPL, но если вы хотите доставляемое приложение GUI, необходимо написать немного Java для вызова кода Clojure. Кроме того, похоже, что архитектура Java-апплета вынуждает вас выйти за рамки более идиоматических передовых практик Clojure, требующих использования изменяемого состояния и т. Д.
Но я также не очень далеко от Clojure, и, возможно, это возможно, и я просто еще не понял, как это сделать правильно.
Так что я не видел Fn-Fx в этом списке, от Тимоти Болдриджа (халгири). Это библиотека Clojure, обеспечивающая функциональную абстракцию над JavaFX. Р>
Clojure и SWT - лучший подход для создания GUI. По сути, SWT - это стиль «включай и работай» для разработки программного обеспечения.
Я не думаю, что есть официальный, но лично я бы воспользовался тем, что использую один из самых мощных языков в мире, и просто представляю, как будет выглядеть идеальный графический код: р>
(form {:title :on-close dispose :x-size 500 :y-size 450}
[(button {:text "Close" :id 5 :on-click #(System/exit 0) :align :bottom})
(text-field {:text "" :on-change #(.println System/out (:value %)) :align :center})
(combo-box {:text "Chose background colour" :on-change background-update-function
:items valid-colours})])
Ваша идея будет отличаться, но, надеюсь, вышеизложенное даст вам некоторое представление.
Я знаю, что вы намекаете на классические настольные решения, но веб вполне подходит для clojure. Я написал полное аудио приложение, в котором все подключено, так что если вы добавляете музыку в аудио папку, она отражается в веб-интерфейсе. Просто сказать, что настольное приложение не единственный способ:)
Моя предпочтительная среда пользовательского интерфейса Clojure использует IO.js (узел для ES6) + Электрон (контейнер) + Quiescent ( Обертка ReactJS) .