Каков наилучший способ сделать GUI в Clojure?
Каков наилучший способ сделать GUI в Clojure?
Есть ли какой-нибудь функциональный Swing или SWT обертка?
Или некоторая интеграция с JavaFX декларативное описание GUI, которое можно легко обернуть на s-выражения с использованием некоторой макрологии?
Любые учебники?
Ответы
Ответ 1
Я смиренно предлагаю Seesaw.
Здесь учебник на основе REPL, который не предполагает знания Java или Swing.
Ситуация очень похожа на то, что предлагает @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!)
Ответ 2
Стюарт Сьерра недавно опубликовал серию постов в блоге по GUI-разработке с clojure (и раскачкой). Начните здесь: http://stuartsierra.com/2010/01/02/first-steps-with-clojure-swing
Ответ 3
Если вы хотите выполнить графическое программирование, я бы указал на Преобразователь температуры или муравьиная колония.
Многие вещи в Swing выполняются путем подклассификации, особенно если вы создаете пользовательские компоненты. Для этого существуют две основные функции/макросы: прокси и gen-class.
Теперь я понимаю, где вы идете с более Lispy способом. Я пока не думаю, что что-то подобное. Я бы настоятельно советовал не пытаться построить грандиозную инфраструктуру GUI-построения a-la CLIM, но сделать что-то еще. Lispy: начните писать свои Swing приложение и абстрактные ваши общие шаблоны с макросами. Когда вы это делаете, у вас может появиться язык для написания ваших графических интерфейсов или, может быть, очень общий материал, который можно разделить и расти.
Одна вещь, которую вы теряете при написании графических интерфейсов в Clojure, - это использование таких инструментов, как Matisse. Это может быть сильным, чтобы написать некоторые части в Java (GUI) и некоторые части в Clojure (логика). Что на самом деле имеет смысл, так как в логике вы сможете построить язык для своей логики с помощью макросов, и я думаю, что там больше, чем с графическим интерфейсом. Очевидно, это зависит от вашего приложения.
Ответ 4
Из этого страница:
(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.
Ответ 5
Никто еще не предложил его, поэтому я буду: браузер в качестве платформы пользовательского интерфейса. Вы можете написать свое приложение в Clojure, включая HTTP-сервер, а затем разработать пользовательский интерфейс, используя что-либо из HTML в hiccup, ClojureScript и любую из миллиардов JS вам нужно. Если вы хотите согласованного поведения браузера и "desktop app look'n'feel", вы можете связать хром с вашим приложением.
Похоже, что Light Table распространяется.
Ответ 6
Существует оболочка для MigLayout в вкладе clojure. Вы также можете взглянуть на эту суть. Я в основном выкладываю любой код, который пишу, когда изучаю свинг/миграцию.
Пример 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)))
Ответ 7
Там было поговорить в списке рассылки о нескольких ячейках (a la Kenny Tilton Cells). Это довольно простой способ программирования GUI.
Ответ 8
Я бы предпочел пойти на clojurefx, это немного преждевременно, но он работает и экономит ваше время.
Я начал свой графический интерфейс с помощью качелей, а затем попробовал другой компонент в clojurefx.
Я закончил оба, и я убежден, что я собираюсь реорганизовать качели на clojurefx.
В конце концов, JavaFX - это способ продвижения вперед.
Он чувствует себя легче, чем качели. Или, по крайней мере, записать его.
Работа с привязками, работа слушателей, большая часть работы с компонентами, иначе просто используйте один из макросов для создания конструктора для этого конкретного случая и выполненной работы. Или, если вам будет сложно, напишите некоторые методы на Java и попросите помочь улучшить clojurefx.
Парень, который написал clojurefx, занят в данный момент, но вы можете разветкить проект и сделать некоторые исправления.
Ответ 9
Вот еще один очень простой пример свинга:
; 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)))
Ответ 10
Я задал себе тот же вопрос написания графического интерфейса в Clojure с Swing и придумал библиотечную подпись
Это позволяет использовать представление вашей доменной модели в виде единой структуры данных Clojure, заключенной в атом.
Смотрите примеры здесь.
Ответ 11
Я разрабатывал Java-апплет, в котором все написано в Clojure, за исключением кода апплета, который написан на Java. Апплет вызывает обратные вызовы кода Clojure для init, paint и т.д. Из java hooks для тех методов, которые определены моделью апплета. Таким образом, код заканчивается на 99,999% Clojure, и вам не нужно вообще думать о крошечной части Java.
Есть некоторые недостатки этого подхода, о которых я надеюсь более подробно обсудить в Clojure Google Group. Я думаю, что разработчики Clojure должны включать собственный способ создания приложений. В настоящее время вы можете делать все, что вам нравится в GUI, из REPL, но если вы хотите предоставить графическое приложение, необходимо написать Java, чтобы вызвать код Clojure. Кроме того, похоже, что архитектура Java-апплета заставляет вас за пределами Clojure больше идиоматических передовых методов, требующих использования изменчивого состояния и т.д.
Но также я не очень далек вместе с Clojure, но возможно, что это возможно, и я просто не обнаружил, как это сделать правильно.
Ответ 12
Так что я не видел Fn-Fx в этом списке, от Тимоти Болдриджа (хальгири). Это библиотека Clojure, обеспечивающая функциональную абстракцию над JavaFX.
Его можно найти на Github по адресу https://github.com/halgari/fn-fx.
Для использования убедитесь, что вы используете последнюю версию Java (1.8 90+) и добавьте зависимость к репозиторию github, добавив в свой project.clj следующее:
:plugins [[lein-git-deps "0.0.1-SNAPSHOT"]]
:git-dependencies [["https://github.com/halgari/fn-fx.git"]]
Я попробовал это, и это работает из коробки.
Ответ 13
Clojure и SWT - лучший подход для выполнения графических интерфейсов. По сути, SWT - это подход, основанный на подключении и воспроизведении для разработки программного обеспечения.
Ответ 14
Я не думаю, что есть официальный, но лично я бы воспользовался тем фактом, что я использую один из самых мощных языков в мире и просто представляю, как выглядит идеальный код gui:
(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})])
Ваша идея будет отличаться, но это, надеюсь, выше, дает вам некоторую идею.
Ответ 15
Я знаю, что вы намекаете на классические настольные решения, но сеть отлично подходит для clojure. Я написал полное аудио приложение, в котором все подключено, так что если вы добавляете музыку в папку аудио, это отражается в веб-интерфейсе. Просто говорю, что приложение для настольных компьютеров - это не единственный способ:)
Ответ 16
Моя предпочтительная среда Clojure UI использует IO.js(Node для ES6) + Electron (Container) + Quiescent (обертка ReactJS).