Каков наилучший способ сделать 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!)

Ответ 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)))

Ответ 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. Я написал полное аудио приложение, в котором все подключено, так что если вы добавляете музыку в папку аудио, это отражается в веб-интерфейсе. Просто говорю, что приложение для настольных компьютеров - это не единственный способ:)