Что является лучшим способом сделать GUIs в Clojure?



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



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



какие уроки?

741   16  

16 ответов:

смиренно предлагаю качели.

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


качели очень похожи на то, что предлагает @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!)

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

Если вы хотите сделать программирование GUI я бы указал на Преобразователь Температуры или колонии муравьев.

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

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

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

от этого страница:

(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");

и, конечно, стоило бы смотреть на!--6-->совместимость раздел веб-сайта clojure.

никто еще не предложил это, поэтому я буду: браузер как платформа пользовательского интерфейса. Вы можете написать свое приложение в Clojure, включая HTTP-сервер, а затем разработать пользовательский интерфейс, используя что угодно от HTML до икота, ClojureScript и любой из миллиардов библиотек JS, которые вам нужны. Если вы хотите последовательное поведение браузера и "desktop app look'n'feel" вы можете пакет chrome с вашим приложением.

Это, кажется, как Световой Стол распространяется.

есть обертка для MigLayout в Clojure contrib. Вы также можете посмотреть http://gist.github.com/261140. я в основном ставлю любой код, который я пишу, когда я изучаю swing / miglayout.

пример dsm переписан шепелявым способом с использованием contrib.качели-утили

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

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

Я бы предпочел пойти на 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)))

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

https://github.com/jonasseglare/signe

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

смотрите примеры здесь:https://github.com/jonasseglare/signe/blob/master/src/signe/examples.clj

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

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

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

поэтому я не видел Fn-Fx в этом списке, от Тимоти Болдриджа (halgiri). Это библиотека Clojure, предоставляющая функциональную абстракцию над JavaFX.

его можно найти на Github по адресу https://github.com/halgari/fn-fx.

чтобы использовать, убедитесь, что вы используете последнюю версию Java (1.8 90+) и добавить зависимость от репозитория github, добавив следующее в свой проект.clj:

:plugins [[lein-git-deps "0.0.1-SNAPSHOT"]] :git-dependencies [["https://github.com/halgari/fn-fx.git"]]

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

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

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

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

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

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

Comments

    Ничего не найдено.