Как лучше всего создавать графические интерфейсы в Clojure?

Как лучше всего использовать графический интерфейс в Clojure?

Есть ли пример функционального Swing или SWT оболочка? Или некоторая интеграция с декларативным описанием графического интерфейса JavaFX, которое можно легко обернуть в s-выражения с использованием некоторой макрологии?

Какие-нибудь уроки?


person Marko    schedule 24.10.2008    source источник


Ответы (17)


Я смиренно предложу качели.

Вот учебник на основе 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!)
person Dave Ray    schedule 10.05.2011
comment
развлекаешь Swing? Они сказали, что это невозможно! - person Michael Bylstra; 26.01.2013
comment
Не нужно быть скромным - этим можно очень гордиться! +1! - person mydoghasworms; 22.04.2013
comment
-1: В вашем коде есть ошибка. На нем написано «Привет, качели» вместо «Привет, мир». - person Thomas Eding; 05.02.2014
comment
Действительно? Качать? Разве это не ограничивает разработчика функциональностью, которую предлагает Swing, только на более высоком уровне абстракции, если таковая имеется? Делает ли Clojure каким-то образом приложения менее устаревшими, или он как-то улучшает все области, в которых Swing слаб? Я говорю о привязках, MVC и всех тех новых вещах, которые Swing теперь предлагает как таковые. Это как-то исправлено языковыми особенностями Clojure? - person Zelphir Kaltstahl; 10.02.2016
comment
Он решил сделать конкретную абстракцию над Swing. Ничего плохого в этом нет ... - person Kenogu Labz; 11.07.2016

Стюарт Сьерра недавно опубликовал серию сообщений в блоге о разработке GUI с помощью clojure (и Swing). Начните здесь: http://stuartsierra.com/2010/01/02/first-steps-with-clojure-swing

person steglig    schedule 31.01.2010

Если вы хотите программировать графический интерфейс, я бы указал на преобразователь температуры или колония муравьев.

Многие вещи в Swing выполняются путем разделения на подклассы, особенно если вы создаете собственные компоненты. Для этого есть две важные функции / макросы: прокси и gen-class.

Теперь я понимаю, куда вы идете, используя более лиспийский путь. Я не думаю, что еще есть что-то подобное. Я бы настоятельно не советовал создавать грандиозный фреймворк для создания графического интерфейса в стиле CLIM, но делать что-то подробнее Lispy: начните писать приложение Swing и абстрагируйте общие шаблоны с помощью макросов. При этом у вас может получиться язык для написания графического интерфейса вашего типа или, может быть, какой-то очень общий материал, которым можно делиться и расти.

Одна вещь, которую вы теряете при написании графического интерфейса в Clojure, - это использование таких инструментов, как Matisse. Это может быть сильным аргументом в пользу написания некоторых частей на Java (GUI) и некоторых частей на Clojure (логика). Что на самом деле имеет смысл, поскольку в логике вы сможете создать язык для своей логики, используя макросы, и я думаю, что от этого можно получить больше, чем с графическим интерфейсом. Очевидно, это зависит от вашего приложения.

person pupeno    schedule 25.10.2008
comment
Не беспокойтесь о потере Мэттисса. Вы можете использовать miglayout.com, который достаточно мощный, чтобы создавать макеты вручную. - person tomjen; 01.10.2009
comment
Вы можете использовать Matisse с Clojure, потому что сгенерированный код - это просто код Java, к которому Clojure может легко получить доступ. На самом деле где-то есть учебник ... - person Rayne; 02.10.2009
comment
Интересно, когда у нас появится первый дизайнер GUI, выводящий закрытие? Из-за гомиконности сгенерированный код даже не должен быть плохим! - person mike3996; 24.11.2010

Пока никто этого не предлагал, поэтому я сделаю следующее: Браузер как платформа пользовательского интерфейса. Вы можете написать свое приложение на Clojure, включая HTTP-сервер, а затем разработать пользовательский интерфейс, используя что угодно, от HTML до hiccup, ClojureScript и любого из миллиарды необходимых вам JS-библиотек. Если вам нужно согласованное поведение браузера и «внешний вид настольного приложения», вы можете связать Chrome со своим приложением.

Похоже, так распределяется Light Table.

person Matthew Gilliard    schedule 14.05.2013
comment
это здорово, но определение правильного порта может быть непростым на каждой клиентской машине. - person scape; 29.08.2013

На этой странице:

(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.

person dsm    schedule 24.10.2008
comment
Да, я знаю, что вы можете вернуться к использованию Swing напрямую, но я спросил, есть ли более шепотливый способ сделать это. - person Marko; 24.10.2008
comment
Также обратите внимание, что в более поздних версиях закрытия вам необходимо добавить файл. перед вызовами функций-членов в блоке задач. - person Jeroen Dirks; 01.10.2009

В 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)))
person Abhijith    schedule 16.12.2009

В списке рассылки было обсуждение нескольких ячеек (a la Ячейки Кенни Тилтона). Это довольно изящный способ программирования с графическим интерфейсом.

person Joe W.    schedule 04.03.2009

Я бы предпочел clojurefx, это немного преждевременно, но оно работает и экономит ваше время.

Я начал свой графический интерфейс с качелей, а затем попробовал другой компонент в clojurefx.

Я закончил оба и убежден, что собираюсь реорганизовать качели до clojurefx.

В конце концов, JavaFX - это путь вперед.

Кажется, это легче, чем качели. Или, по крайней мере, писать ..

Привязки работают, слушатели работают, большая часть компонентов работает, в противном случае просто используйте один из макросов для создания конструктора для этого конкретного случая и выполнения работы. Или, если вам сложно, напишите несколько методов на Java и попросите помощи в улучшении clojurefx.

Парень, который написал clojurefx, сейчас занят, но вы можете форкнуть проект и внести некоторые исправления.

person Efrain Bergillos    schedule 04.12.2014
comment
Решил ли JavaFX проблемы, связанные с тем, что он еще не выглядит очень родным? Серьезный вопрос, потому что, когда я впервые его проверил, это было очень давно и выглядело менее правильным, чем Swing. - person Trejkaz; 09.08.2017

Вот еще один очень простой пример свинга:

; 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)))
person Jeroen Dirks    schedule 01.10.2009

Я задал себе тот же вопрос о написании GUI в Clojure с помощью Swing и придумал библиотеку signe

Он позволяет вам представить модель предметной области в виде единой структуры данных Clojure, заключенной в атом.

См. Примеры здесь.

person Rulle    schedule 13.01.2015

Я занимаюсь разработкой Java-апплета, в котором все написано на Clojure, кроме кода апплета, написанного на Java. Апплет вызывает обратные вызовы кода Clojure для init, paint и т. Д. Из java-хуков для тех методов, которые определены моделью апплета. Таким образом, код на 99,999% состоит из Clojure, и вам вообще не нужно думать о крошечном фрагменте Java.

У этого подхода есть некоторые недостатки, которые я надеюсь обсудить более подробно в Clojure Google Group. Я думаю, что разработчики Clojure должны включить собственный способ создания приложений. В настоящее время вы можете делать все, что угодно, с графическим интерфейсом пользователя из REPL, но если вам нужно доставляемое приложение с графическим интерфейсом, необходимо написать немного Java для вызова кода Clojure. Кроме того, похоже, что архитектура Java-апплета вынуждает вас выходить за рамки более идиоматических передовых практик Clojure, требуя от вас использования изменяемого состояния и т. Д.

Но кроме того, я еще не очень далеко с Clojure, и, возможно, это возможно, и я просто еще не понял, как это сделать правильно.

person Community    schedule 16.02.2009

Моя предпочтительная среда пользовательского интерфейса Clojure использует IO.js (узел для ES6) + Electron (контейнер) + Quiescent (оболочка ReactJS).

person T.W.R. Cole    schedule 03.09.2015
comment
Это может быть сложно, но я все же хочу спросить: не могли бы вы привести пример того, как начать работу с этими частями? Или опишите, какая часть приложения будет обрабатываться какой из упомянутых вами фреймворков / библиотек? - person Zelphir Kaltstahl; 10.02.2016

Так что я не видел 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"]]

Я пробовал, и работает "из коробки".

person Bill Barnhill    schedule 09.06.2017

Clojure и SWT - лучший подход для создания графического интерфейса (ов). По сути, SWT - это подход в стиле plug and play для разработки программного обеспечения.

person Berlin Brown    schedule 27.01.2009
comment
Можете дать ссылку или пример? Мне было бы интересно, но я понятия не имею, с чего начать. - person Carl Smotricz; 21.11.2009
comment
Карл, второй. Было бы неплохо получить хороший учебник о том, как писать плагины Eclipse с использованием clojure. - person Egon Willighagen; 31.01.2010

Я не думаю, что есть официальный, но лично я бы воспользовался тем фактом, что использую один из самых мощных языков в мире, и просто представил, как будет выглядеть идеальный код 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})])

Ваша идея будет отличаться, но, надеюсь, это должно дать вам некоторое представление.

person tomjen    schedule 01.10.2009
comment
Похоже, отличный DSL SwingBuilder переведен на Clojure. - person Marko; 02.10.2009
comment
@ dev-er-dev: Вполне возможно, я никогда не использовал groovy, но великие умы делают то же самое :) - person tomjen; 03.10.2009

Я знаю, что вы намекаете на классические настольные решения, но веб вполне подходит для clojure. Я написал полное звуковое приложение, в котором все подключено, поэтому, если вы добавляете музыку в аудио-папку, она отражается в веб-интерфейсе. Просто говорю, что настольное приложение - не единственный способ :)

person Anders Rune Jensen    schedule 26.12.2009

cljfx описывается как

Декларативная, функциональная и расширяемая оболочка JavaFX, вдохновленная лучшими частями реакции и изменения кадра.

и JavaFx как

... платформа клиентских приложений нового поколения с открытым исходным кодом для настольных, мобильных и встроенных систем, построенная на Java. Это совместные усилия многих людей и компаний с целью создания современного, эффективного и полнофункционального набора инструментов для разработки многофункциональных клиентских приложений.

Его создатель использует его для создания раскрытия и hackernews demo, в котором представлены различные возможности и некоторая комплектация для нескольких ОС через jpackage.

С ним вы можете получить разработку на Clojure REPL, используя JavaFX для создания пользовательских интерфейсов для настольных компьютеров, мобильных устройств и Интернета.

person Micah Elliott    schedule 15.04.2021