Clojure'da GUI yapmanın en iyi yolu nedir?


Yanıtlar:


121

Alçakgönüllülükle Tahterevalli önereceğim .

Java veya Swing bilgisi gerektirmeyen REPL tabanlı bir eğitim .


Tahterevalli @tomjen'in önerisine çok benziyor. İşte "Merhaba, Dünya":

(use 'seesaw.core)

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

ve işte @Abhijith ve @ dsm'nin örneği, kelimenin tam anlamıyla tercüme edildi:

(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!)

2
Swing'i eğlenceli kılıyor? Bunun mümkün olmadığını söylediler!
Michael Bylstra

9
Mütevazi olmanıza gerek yok - bundan gurur duyabilirsiniz! 1!
mydoghasworms

7
-1: Kodunuzda bir hata var. "Merhaba Dünya" yerine "Merhaba Tahterevalli" yazıyor. </Joke>
Thomas Eding

1
Gerçekten mi? Salıncak? Bu, geliştiriciyi Swing'in sunduğu işlevsellik ile sınırlamaz mı, sadece daha yüksek bir soyutlama düzeyinde mi? Clojure bir şekilde uygulamaları daha az modası geçmiş yapıyor mu yoksa Swing'in zayıf olduğu tüm alanları bir şekilde iyileştiriyor mu? Bağlamalar ve MVC ve Swing'in kendi başına sunduğu tüm bu "yeni" şeyler hakkında konuşuyorum. Clojure'un dil özellikleri bir şekilde düzeltildi mi?
Zelphir Kaltstahl

1
Özellikle Swing üzerinde odaklanmış bir soyutlamayı seçti.
Bunda


16

GUI programlaması yapmak istiyorsanız, Sıcaklık Dönüştürücüyü veya karınca kolonisini işaret ederdim .

Swing'deki birçok şey, özellikle özel bileşenler oluşturuyorsanız, alt sınıflandırma yoluyla yapılır. Bunun için iki temel işlev / makro vardır: proxy ve gen sınıfı .

Şimdi nereye gideceğinizi daha Lispy ile anlıyorum. Henüz böyle bir şey olduğunu sanmıyorum. Görkemli bir GUI oluşturma çerçevesi a-la CLIM oluşturmaya çalışmamanızı şiddetle tavsiye ediyorum , ancak daha fazla bir şey yapmak için Lispy: Swing uygulamanızı yazmaya başlayın ve makrolarla ortak kalıplarınızı soyutlayın. Bunu yaparken, tür GUI'lerinizi yazmak için bir dil ya da paylaşılıp büyüyebilen çok genel şeyler bulabilirsiniz.

Clojure'da GUI'leri yazarken kaybettiğiniz bir şey, Matisse gibi araçların kullanılmasıdır. Bu, bazı bölümleri Java'da (GUI) ve bazı bölümleri Clojure'da (mantık) yazmak için güçlü bir işaret olabilir. Bu aslında mantıklı olduğu gibi, makroları kullanarak mantık türünüz için bir dil oluşturabileceksiniz ve sanırım orada GUI'den çok daha fazla kazanç var. Açıkçası, uygulamanıza bağlıdır.


2
Mattisse'i kaybetme konusunda endişelenme. Düzeni elle yapabileceğiniz kadar güçlü miglayout.com'u kullanabilirsiniz .
tomjen

Matisse'i Clojure ile kullanabilirsiniz, çünkü üretilen kod sadece Clojure tarafından sorunsuzca erişilebilen Java kodudur. Aslında bir yerde bunun için bir öğretici var ...
Rayne

3
İlk clojure çıktısı GUI tasarımcısını ne zaman aldığımızı merak ediyorum. Homikoniklik nedeniyle, üretilen kod kötü bile olmamalıdır!
nperson325681

15

Henüz kimse önermedi, ben de yapacağım: UI platformu olarak tarayıcı. Uygulamanızı bir HTTP sunucusu da dahil olmak üzere Clojure'a yazabilir ve HTML'den hıçkırık , ClojureScript ve ihtiyacınız olan milyarlarca JS libarisinden herhangi birine kadar kullanıcı arayüzü geliştirebilirsiniz . Tutarlı tarayıcı davranışı ve "masaüstü uygulaması look'n'feel" istiyorsanız, kromu uygulamanızla birlikte paketleyebilirsiniz .

Işık Tablosu bu şekilde dağılmış görünüyor .


bu harika, ancak uygun bağlantı noktasını belirlemek her istemci makinede zor olabilir
scape

14

Bu sayfadan :

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

Ve elbette, clojure web sitesinin birlikte çalışabilirlik bölümüne bakmaya değer .


3
Evet, Swing'i doğrudan kullanmaya başlayabileceğini biliyorum, ama bunu yapmanın daha lisanlı bir yolu varsa ben de sordu.
Marko

Ayrıca, kapatma işleminin en son sürümlerinde bir. üye işlevinin önünde yapılacaklar bloğunu çağırır.
Jeroen Dirks

8

Clojure katkıda MigLayout için bir sarıcı var. Bu özete de bir göz atabilirsiniz . Temelde ben salıncak / miglayout öğreniyorum yazıyorum ne kodu koydum.

dsm'nin örneği, katkıda.swing-utils kullanılarak yeniden yazılmış şekilde

(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

Clojurefx'i tercih ederim, biraz erken, ama işe yarıyor ve size zaman kazandırıyor.

GUI'ye tahterevalli ile başladım ve sonra clojurefx'te başka bir bileşen denedim.

İkisini de bitirdim ve tahterevalli olanı clojurefx'e yeniden düzenleyeceğime ikna oldum.

Sonuçta, JavaFX ilerlemenin yoludur.

Tahterevalli olmaktan daha hafif geliyor. Ya da en azından yazarak ..

Bağlamalar çalışır, dinleyiciler çalışır, bileşen çalışmalarının çoğu, aksi takdirde, bu özel durum ve iş için bir kurucu oluşturmak için makrolardan birini kullanın. Veya, zor bulursanız, Java'da bazı yöntemler yazın ve clojurefx'i geliştirmek için yardım isteyin.

Clojurefx yazan adam şu anda meşgul, ancak projeyi çatallayabilir ve bazı düzeltmeler yapabilirsiniz.


JavaFX henüz çok doğal görünmeme problemlerini çözdü mü? Ciddi soru, çünkü ilk kontrol ettiğimde, uzun zaman önceydi ve Swing'den daha az doğru görünüyordu.
Trejkaz

4

İşte başka bir çok temel salıncak sarma örneği:

; 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

Kendime Swing ile Clojure'da bir GUI yazma sorusunu sordum ve kütüphane signe ile geldim

Etki alanı modelinizi, bir atomun içine sarılmış tek bir Clojure veri yapısı olarak temsil etmenizi sağlar.

Buradaki örneklere bakın .


2

Java ile yazılmış uygulama kodu dışında her şeyin Clojure'da yazıldığı bir Java uygulaması geliştiriyorum. Uygulama, uygulama modeli tarafından tanımlanan yöntemler için Clojure kodunun java'nın kancalarından init, paint vb. Geri çağrılarını çağırır. Böylece kod yüzde 99.999 Clojure olur ve çoğunlukla küçük Java parçasını düşünmek zorunda kalmazsınız.

Clojure Google Grubu hakkında daha ayrıntılı olarak tartışmayı umduğum bu yaklaşımın bazı dezavantajları var. Clojure geliştiricilerinin yerel bir uygulama oluşturma yöntemi içermesi gerektiğini düşünüyorum. Şu anda REPL'den istediğiniz GUI öğelerini yapabilirsiniz, ancak teslim edilebilir bir GUI uygulaması istiyorsanız, Clojure kodunu çağırmak için bazı Java yazmanız gerekir. Ayrıca, bir Java Uygulamasının mimarisi sizi Clojure'un daha deyimsel en iyi uygulamalarının dışına zorlar ve değişebilir durumu kullanmanızı gerektirir.

Ama aynı zamanda, henüz Clojure ile çok uzak değilim ve bunun mümkün olabileceği ve henüz nasıl doğru bir şekilde yapılacağını henüz bilmedim.



2

Bu yüzden bu listede Timothy Baldridge'den (halgiri) Fn-Fx görmedim. Bu, JavaFX üzerinde işlevsel bir soyutlama sağlayan bir Clojure kütüphanesidir.

Github'da https://github.com/halgari/fn-fx adresinde bulunabilir .

Kullanmak için, Java'nın (1.8 90+) yeni bir sürümünü kullandığınızdan emin olun ve projenize aşağıdakileri ekleyerek github deposuna bağımlılık ekleyin:

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

Denedim ve kutunun dışında çalışıyor.


1

Clojure ve SWT, GUI (ler) i yapmak için en iyi yaklaşımdır. Esasen SWT, yazılım geliştirmek için tak ve çalıştır tarzı bir yaklaşımdır.


1
Bir bağlantı veya örnek verebilir misiniz? İlgilenirim ama nasıl başlayacağımı bilmiyorum.
Carl Smotricz

1
Carl, ikincisi. Clojure kullanarak Eclipse eklentilerinin nasıl yazılacağı hakkında iyi bir öğretici oldukça güzel olurdu.
Egon Willighagen

1

Resmi bir dil olduğunu düşünmüyorum, ama şahsen dünyanın en güçlü dillerinden birini kullandığımdan ve sadece mükemmel gui kodunun nasıl görüneceğini hayal ediyorum:

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

Fikriniz farklı olacaktır, ancak bu umarım yukarıda belirtilenler size bir fikir verir.


Clojure'a çevrilmiş harika SwingBuilder dsl'ye benziyor.
Marko

@ dev-er-dev Bu çok mümkün, hiç harika kullanmadım, ama büyük beyinler benzer şeyler yapıyor :)
tomjen

1

Klasik masaüstü çözümleri önerdiğini biliyorum, ancak web clojure ile oldukça iyi uyuyor. Ses klasörüne müzik eklerseniz, web arayüzünde yansıtıldığı her şeyin bağlandığı eksiksiz bir ses uygulaması yazdım. Masaüstü uygulamasının tek yol olmadığını söylemek :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.