2008-10-24 4 views
140

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

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

Любые учебники?

ответ

116

Я смиренно предлагаю Seesaw.

Here's a REPL-based tutorial, который не предполагает знания Java или Swing.


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

Из этого page:

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

И, конечно, было бы стоит посмотреть на interoperability разделе сайта Clojure в.

+3

Да, я знаю, что вы можете вернуться к использованию Swing напрямую, но я спросил, есть ли еще более липкий способ сделать это. – Marko 2008-10-24 12:54:25

+0

Также обратите внимание, что в более поздних версиях закрытия вам нужно добавить a. перед вызовами функции-члена в блоке todo. – 2009-10-01 17:41:19

+0

@James - отредактировал ответ, чтобы отразить это. – dsm 2009-10-02 07:49:50

16

Если вы хотите сделать программирование на GUI, я бы указал на Temperature Converter или the ants colony.

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

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

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

+2

Не беспокойтесь о потере Mattisse. Вы можете использовать http://www.miglayout.com/, который достаточно мощный, чтобы вы могли делать макеты вручную. – tomjen 2009-10-01 18:37:20

+0

Вы можете использовать Matisse с Clojure, потому что сгенерированный код - это просто код Java, который может быть легко доступен Clojure. На самом деле есть учебник для этого где-то ... – Rayne 2009-10-01 22:10:21

+3

Интересно, когда мы получаем первый дизайнер GUI, создающий clojure. Из-за гомоконичности, сгенерированный код не должен быть даже плохим! – progo 2010-11-24 19:04:26

1

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

+1

Можете ли вы предоставить ссылку или пример? Мне было бы интересно, но я понятия не имею, как начать. – 2009-11-20 21:12:42

+1

Карл, второй, что. Хороший учебник о том, как писать плагины Eclipse с использованием clojure, будет довольно приятным. – 2010-01-31 12:42:06

2

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

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

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

4

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

; 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))) 
1

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

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

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

8

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

DSM, переписана в Lispy способом с использованием 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))) 
1

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

13

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

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

5

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

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

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

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

Он чувствует себя легче, чем качели. Или, по крайней мере, написав это.

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

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

3

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

https://github.com/jonasseglare/signe

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

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

1

Итак, я не видел Fn-Fx в этом списке, от Тимоти Болдриджа (halgiri). Это библиотека 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"]]

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

Смежные вопросы