it-swarm.com.ru

Каков наилучший способ сделать GUI в Clojure?

Каков наилучший способ сделать GUI в Clojure ?

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

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

144
Marko

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

Вот учебник на основе REPL , который не предполагает Java или знания Swing.


Seesaw очень похож на то, что предлагает @tomjen. Вот "Привет, Мир":

(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!)
116
Dave Ray

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

32
steglig

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

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

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

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

16
pupeno

Отсюда страница :

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

14
dsm

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

Это похоже на то, как Light Table распространяется.

14
Matthew Gilliard

Существует оболочка для MigLayout в вкладе clojure. Вы также можете взглянуть на это Gist . Я в основном выкладываю любой код, который пишу, когда изучаю свинг/миграцию.

пример 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)))
8
Abhijith

Там было поговорим в списке рассылки о нескольких реализациях Cells (а-ля Кенни Тилтон ). Это довольно аккуратный способ программирования GUI.

6
Joe W.

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

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

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

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

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

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

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

5
Efrain Bergillos

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

; 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)))
4
Jeroen Dirks

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

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

Смотрите примеры здесь .

3
Rulle

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

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

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

2
Robert Levy

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

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

2
Bill Barnhill

Clojure и SWT - лучший подход для создания GUI. По сути, SWT - это стиль "включай и работай" для разработки программного обеспечения.

1
Berlin Brown

Я не думаю, что есть официальный, но лично я бы использовал тот факт, что я использую один из самых мощных языков в мире, и просто представляю, как будет выглядеть идеальный графический код:

(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})])

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

1
tomjen

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

1
T.W.R. Cole

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

1
Anders Rune Jensen