Вопрос:

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

java user-interface lisp clojure

41427 просмотра

16 ответа

22242 Репутация автора

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

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

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

Автор: Marko Источник Размещён: 24.10.2008 11:31

Ответы (16)


14 плюса

8994 Репутация автора

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

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

Автор: dsm Размещён: 24.10.2008 12:21

16 плюса

108648 Репутация автора

Если вы хотите заниматься программированием с помощью графического интерфейса, я бы указал на « Конвертер температуры» или колонию муравьев .

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

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

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

Автор: pupeno Размещён: 25.10.2008 12:19

1 плюс

4352 Репутация автора

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

Автор: Berlin Brown Размещён: 27.01.2009 03:34

2 плюса

0 Репутация автора

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

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

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

Автор: Robert Levy Размещён: 16.02.2009 02:52

6 плюса

1052 Репутация автора

В списке рассылки говорилось о нескольких реализациях Cells (a la Kenny Tilton's Cells ). Это довольно аккуратный способ программирования GUI.

Автор: Joe W. Размещён: 04.03.2009 01:29

4 плюса

3739 Репутация автора

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

; 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)))
Автор: Jeroen Dirks Размещён: 01.10.2009 05:43

1 плюс

2958 Репутация автора

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

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

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

Автор: tomjen Размещён: 01.10.2009 07:05

8 плюса

800 Репутация автора

Существует оболочка для 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)))
Автор: Abhijith Размещён: 16.12.2009 02:16

1 плюс

2246 Репутация автора

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

Автор: Anders Rune Jensen Размещён: 26.12.2009 10:28

32 плюса

628 Репутация автора

Стюарт Сьерра недавно опубликовал серию постов в блоге по GUI-разработке с clojure (и раскачкой). Начните здесь .

Автор: steglig Размещён: 31.01.2010 12:17

116 плюса

34392 Репутация автора

Решение

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

Вот учебник на основе 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!)
Автор: Dave Ray Размещён: 10.05.2011 02:55

14 плюса

6796 Репутация автора

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

Это похоже на то, как Light Table распространяется.

Автор: Matthew Gilliard Размещён: 14.05.2013 03:17

5 плюса

51 Репутация автора

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

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

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

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

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

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

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

Автор: Efrain Bergillos Размещён: 04.12.2014 02:33

3 плюса

1028 Репутация автора

Я задал себе тот же вопрос написания графического интерфейса в Clojure с Swing и придумал библиотечную подпись

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

Смотрите примеры здесь .

Автор: Rulle Размещён: 13.01.2015 11:59

1 плюс

3516 Репутация автора

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

Автор: T.W.R. Cole Размещён: 03.09.2015 05:00

2 плюса

846 Репутация автора

Так что я не видел 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"]]

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

Автор: Bill Barnhill Размещён: 09.06.2017 04:44
Вопросы из категории :
32x32