Jaki jest najlepszy sposób na tworzenie Gui w Clojure?

Jak najlepiej zrobić Gui w Clojure ?

Czy jest przykład jakiegoś funkcjonalnego Swing lub SWT wrappera? Albo jakaś integracja z JavaFX deklaratywnym opisem GUI, który można łatwo zawinąć do S-wyrażeń przy użyciu jakiejś makrologii?

Jakieś tutoriale?

Author: Peter Mortensen, 2008-10-24

16 answers

Pokornie zasugeruję huśtawka .

Oto samouczek oparty na REPL , który zakłada brak wiedzy Java lub Swing.


Huśtawka jest podobna do tego, co sugeruje @tomjen. Oto "Witaj, świecie":

(use 'seesaw.core)

(-> (frame :title "Hello"
       :content "Hello, Seesaw"
       :on-close :exit)
  pack!
  show!)

A oto przykład @Abhijith i @dsm, przetłumaczony dosłownie:

(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!)
 116
Author: Dave Ray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-10 19:38:24

Stuart Sierra opublikował ostatnio serię postów na blogu na temat tworzenia GUI z clojure (i swing). Zacznij tutaj: http://stuartsierra.com/2010/01/02/first-steps-with-clojure-swing

 32
Author: steglig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-31 12:17:16

Jeśli chcesz zaprogramować GUI, wskażę konwerter temperaturylub kolonię mrówek.

Wiele rzeczy w swingu odbywa się przez podkategorię, szczególnie jeśli tworzysz niestandardowe komponenty. Do tego są dwie podstawowe funkcje / makra: proxy i Gen-class.

Teraz rozumiem, gdzie idziesz z bardziej Lispy sposób. Nie sądzę, żeby jeszcze coś takiego było. Zdecydowanie odradzam budowanie wspaniałego GUI-building framework a-la CLIM, ale aby zrobić coś bardziej Lispy: zacznij pisać swoją aplikację Swing i abstrakcję wspólnych wzorców za pomocą makr. Kiedy to robisz, możesz skończyć z językiem do pisania swojego rodzaju GUI, a może niektóre bardzo ogólne rzeczy, które można udostępniać i rozwijać.

Jedną z rzeczy, które tracisz pisząc Gui w Clojure, jest użycie narzędzi takich jak Matisse. To może być silnym wskazaniem, aby napisać niektóre części w Javie (GUI) i niektóre części w Clojure (the logika). Co faktycznie ma sens, ponieważ w logice będziesz w stanie zbudować język dla swojego rodzaju logiki za pomocą makr i myślę, że jest tam więcej do zyskania niż z GUI. Oczywiście zależy to od twojej aplikacji.

 16
Author: pupeno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-20 21:10:11

From this 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");

I oczywiście warto zajrzeć do sekcji na stronie clojure.

 14
Author: dsm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-02 07:49:23

Nikt jeszcze nie zasugerował, więc będę: przeglądarka jako platforma UI. Możesz napisać swoją aplikację w Clojure, w tym na serwerze HTTP, a następnie rozwinąć interfejs użytkownika używając wszystkiego, od HTML do czkawki, ClojureScript i dowolnego z miliardów bibliotek JS, których potrzebujesz. Jeśli chcesz spójnego zachowania przeglądarki i "wygląd aplikacji desktopowej", możesz połączyć chrome ze swoją aplikacją.

Tak wygląda rozkład tablicy świetlnej.

 13
Author: Matthew Gilliard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-14 15:17:07

W clojure contrib jest wrapper dla MigLayout. Możesz też zajrzeć http://gist.github.com/261140 . w zasadzie umieszczam kod, który piszę, gdy uczę się swing/miglayout.

Przykład Dsm został napisany w sposób lispy przy użyciu 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
Author: Abhijith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-24 16:21:29

Była dyskusja na liście dyskusyjnejo kilku komórkach (a la komórki Kenny ' ego Tiltona). To całkiem zgrabny sposób na programowanie GUI.

 6
Author: Joe W.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-04 13:29:21

Wolałbym wybrać clojurefx, jest to trochę przedwczesne, ale działa i oszczędza czas.

Uruchomiłem GUI z huśtawką, a następnie wypróbowałem inny komponent w clojurefx.

Skończyłem oba i jestem przekonany, że zamierzam refaktorować huśtawkę do clojurefx.

W końcu JavaFX jest drogą do przodu.

Czuje się lżejszy niż huśtawka. A przynajmniej, pisząc to..

Wiązania działają, słuchacze działają, większość komponentów działa, inaczej, wystarczy użyć jednego z makr, aby utworzyć konstruktor dla danego przypadku i wykonanego zadania. Lub, jeśli masz trudności, napisz kilka metod w Javie i poproś o pomoc w ulepszeniu clojurefx.

Facet, który napisał clojurefx jest w tej chwili zajęty, ale możesz rozwidlić projekt i zrobić kilka poprawek.

 5
Author: Efrain Bergillos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-04 14:33:45

Oto kolejny bardzo podstawowy przykład owijania wahadłowego.

; 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)))
 4
Author: Jeroen Dirks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-01 17:43:40

Zadałem sobie to samo pytanie o napisanie GUI w Clojure ze swingiem i wpadłem na tą bibliotekę:

Https://github.com/jonasseglare/signe

Pozwala na użycie modelu reprezentowania domeny jako pojedynczej struktury danych Clojure zawiniętej wewnątrz atomu.

Zobacz przykłady tutaj: https://github.com/jonasseglare/signe/blob/master/src/signe/examples.clj

 3
Author: Rulle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-13 11:59:32

Rozwijałem aplet Javy, w którym wszystko jest napisane w Clojure, z wyjątkiem kodu apletu, który jest napisany w Javie. Aplet wywołuje wywołania kodu Clojure wywołania INIT, paint, itp z hooków Javy dla tych metod, które są zdefiniowane przez model apletu. Tak więc kod kończy się na 99.999% Clojure i nie musisz w ogóle myśleć o małym kawałku Javy.

Są pewne wady tego podejścia, które mam nadzieję omówić w więcej szczegóły na Clojure Google Group. Myślę, że programiści Clojure powinni uwzględnić natywny sposób budowania aplikacji. Obecnie możesz zrobić cokolwiek GUI rzeczy, które lubisz z REPL, ale jeśli chcesz dostarczanej aplikacji GUI, konieczne jest napisanie trochę Java, aby wywołać kod Clojure. Wydaje się też, że architektura apletu Javy wymusza na Tobie poza bardziej idiomatycznymi praktykami Clojure, wymagającymi użycia mutowalnego stanu itp.

Ale też nie jestem zbyt daleko razem z Clojure jeszcze i może być tak, że jest to możliwe, a ja po prostu nie odkryłem jeszcze, Jak to zrobić poprawnie.

 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-16 14:52:00

Więc nie widziałem Fn-Fx na tej liście, od Timothy Baldridge (halgiri). Jest to biblioteka Clojure zapewniająca abstrakcję funkcjonalną w JavaFX.

Można go znaleźć na Githubie pod adresem https://github.com/halgari/fn-fx .

Aby użyć, upewnij się, że używasz najnowszej wersji Javy (1.8 90+) i dodaj zależność do repo github, dodając następujące elementy do swojego projektu.clj:

:plugins [[lein-git-deps "0.0.1-SNAPSHOT"]] :git-dependencies [["https://github.com/halgari/fn-fx.git"]]

Próbowałem i działa po wyjęciu z pudełka.
 2
Author: Bill Barnhill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-09 16:44:28

Clojure i SWT to najlepsze podejście do tworzenia GUI (ów). Zasadniczo SWT jest podejściem typu plug and play do tworzenia oprogramowania.

 1
Author: Berlin Brown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-27 15:34:20

Nie wydaje mi się, aby istniał oficjalny, ale osobiście wykorzystałbym fakt, że używam jednego z najpotężniejszych języków na świecie i wyobraź sobie, jak wyglądałby idealny kod 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})])

Twój pomysł byłby inny, ale to powinno mieć nadzieję, że powyższy daje Ci jakiś pomysł.

 1
Author: tomjen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-01 19:05:06

Wiem, że sugerujesz klasyczne rozwiązania desktopowe, ale web całkiem dobrze pasuje do clojure. Napisałem kompletną aplikację audio, w której wszystko jest podłączone tak, że jeśli dodasz muzykę do folderu audio, jest to odzwierciedlone w interfejsie WWW. Tylko mówię, że aplikacja desktopowa to nie jedyny sposób:)

 1
Author: Anders Rune Jensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-26 22:28:11

Moje preferowane środowisko Clojure UI używa IO.js (węzeł dla ES6) + Elektron (Pojemnik) + Quiescent (ReactJS wrapper) .

 1
Author: T.W.R. Cole,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-03 17:00:44