Каков наилучший способ сделать GUI в Clojure? - PullRequest
144 голосов
/ 24 октября 2008

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

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

Есть ли уроки?

Ответы [ 16 ]

116 голосов
/ 10 мая 2011

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

Вот учебник на основе 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!)
32 голосов
/ 31 января 2010

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

16 голосов
/ 25 октября 2008

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

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

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

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

14 голосов
/ 14 мая 2013

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

Похоже, что Light Table распространяется.

14 голосов
/ 24 октября 2008

С этой страницы :

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

8 голосов
/ 16 декабря 2009

В clojure contrib есть обертка для MigLayout. Вы также можете посмотреть http://gist.github.com/261140. Я в основном выкладываю любой код, который пишу, когда изучаю свинг / 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)))
6 голосов
/ 04 марта 2009

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

5 голосов
/ 04 декабря 2014

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

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

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

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

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

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

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

4 голосов
/ 01 октября 2009

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

; 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)))
3 голосов
/ 13 января 2015

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

https://github.com/jonasseglare/signe

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

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

...