Відповіді:
Я смиренно запропоную Сесау .
Ось підручник на основі 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!)
Нещодавно Стюарт Сьєрра опублікував серію публікацій в блозі про GUI-розробки з clojure (і розмахом). Почніть тут: http://stuartsierra.com/2010/01/02/first-steps-with-clojure-swing
Якщо ви хочете зайнятися програмуванням графічного інтерфейсу, я би вказав на перетворювач температури або колонію мурах .
Багато речей у Swing виконуються за допомогою підкласифікації, особливо якщо ви створюєте власні компоненти. Для цього існують дві основні функції / макроси: проксі та ген-клас .
Тепер я розумію, куди ви їдете з більш Ліспі. Я не думаю, що ще немає нічого подібного. Я б настійно радив не намагатися створити грандіозний каркас для побудови графічного інтерфейсу a-la CLIM , але зробити щось більше Lispy: почніть писати додаток Swing і абстрагуйте свої загальні шаблони з макросами. Виконуючи це, ви можете розробити мову для написання свого типу графічних інтерфейсів, або, можливо, дуже загальні речі, якими можна ділитися та розвиватися.
Одне, що ви втрачаєте при написанні графічних інтерфейсів у Clojure, - це використання таких інструментів, як Matisse. Це може бути сильним вказівкою на написання деяких частин на Java (GUI), а деяких - у Clojure (логіка). Що насправді має сенс, оскільки в логіці ви зможете створити мову для свого типу логіки за допомогою макросів, і я думаю, що там можна отримати більше, ніж з графічним інтерфейсом. Очевидно, це залежить від вашої заявки.
Ще ніхто не запропонував цього, тому я буду: браузер як платформа UI. Ви можете написати додаток в Clojure, в тому числі сервер HTTP , а потім розробити призначений для користувача інтерфейс , використовуючи що - небудь від HTML до гикавки , ClojureScript і будь-який з мільярдів JS вам потрібно знайти бібліотеки. Якщо ви хочете послідовної поведінки веб-переглядача та "настільної програми look'n'feel", ви можете поєднати хром зі своїм додатком .
Схоже, таким чином розподіляється Світлова таблиця .
З цієї сторінки :
(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 в.
У додатку clojure є обгортка для 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)))
У списку розсилки говорилося про декілька реалізацій Cells (a La Kenny Tilton's Cells ). Це досить акуратний спосіб зробити програмування 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)))
Я розробляв аплет Java, в якому все написано в Clojure, крім коду аплета, який написаний на Java. Аплет викликає зворотні виклики коду Clojure про init, фарбу тощо з гаків java для тих методів, які визначені моделлю аплет. Таким чином, код в кінцевому підсумку становить 99,999 відсотків Clojure, і вам зовсім не доведеться думати про крихітний Java-фрагмент.
У цьому підході є деякі недоліки, про які я сподіваюся детальніше обговорити в групі Clojure Google. Я думаю, що розробники Clojure повинні включати в себе власний спосіб створення додатків. В даний час ви можете робити все, що вам подобається в графічному інтерфейсі від REPL, але якщо ви хочете отримати доступний GUI-додаток, потрібно написати Java, щоб зателефонувати на код Clojure. Крім того, здається, що архітектура Java-аплету вимушує вас за межами кращих ідіоматичних практик Clojure, вимагаючи від вас змінного стану тощо.
Але також я ще не дуже далеко з Clojure, і, можливо, це можливо, і я просто ще не дізнався, як це зробити правильно.
Моє переважне середовище інтерфейсу Clojure використовує IO.js (Node for ES6) + Electron (Container) + Quiescent (ReactJS обгортка) .
Тому я не бачив у цьому списку 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"]]
Я спробував це, і він працює з коробки.
Clojure та SWT - найкращий підхід для ведення графічних інтерфейсів. По суті, SWT - це стиль підключення та розробки програмного забезпечення для розробки програмного забезпечення.
Я не думаю, що існує офіційна, але особисто я би скористався тим, що я використовую одну з найпотужніших мов у світі і лише уявляю, як виглядатиме ідеальний код 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})])
Ваша ідея відрізнятиметься, але це, мабуть, сподівається, що вищесказане дає вам певну ідею.
Я знаю, що ви натякаєте на класичні рішення для настільних комп'ютерів, але веб дуже добре поєднується з клоджур. Я написав повний аудіо-додаток, де все підключено, так що якщо ви додасте музику до папки аудіо, це відображається в веб-інтерфейсі. Просто кажучи, що настільний додаток - не єдиний спосіб :)