2008-10-24 23 views
140

Clojure में जीयूआई करने का सबसे अच्छा तरीका क्या है?क्लोजर में जीयूआई करने का सबसे अच्छा तरीका क्या है?

क्या कुछ कार्यात्मक Swing या SWT रैपर का एक उदाहरण है? या JavaFX घोषणात्मक जीयूआई विवरण के साथ कुछ एकीकरण जिसे कुछ मैक्रोलॉजी का उपयोग करके आसानी से s-expressions पर लपेटा जा सकता है?

कोई भी ट्यूटोरियल?

उत्तर

116

मैं विनम्रतापूर्वक Seesaw का सुझाव देगा।

Here's a REPL-based tutorial कि कोई जावा या स्विंग ज्ञान मान लिया गया है।


सेसो का बहुत कुछ @tomjen सुझाव देता है। यहां बताया गया है "नमस्ते, दुनिया":

(use 'seesaw.core) 

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

और यहाँ @Abhijith और @ डीएसएम के उदाहरण, सुंदर शाब्दिक अनुवाद है:

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

यह बहुत अच्छा लग रहा है! – danlei

+2

स्विंग मज़ा बनाते हैं? उन्होंने कहा कि यह संभव नहीं था! –

+7

विनम्र होने की कोई आवश्यकता नहीं है - आपको इस पर बहुत गर्व हो सकता है! +1! – mydoghasworms

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

और, बेशक, यह clojure की वेबसाइट के interoperability अनुभाग को देख के लायक हो जाएगा।

+3

हाँ, मुझे पता है कि आप सीधे स्विंग का उपयोग करने के लिए वापस आ सकते हैं, लेकिन अगर मैं इसे करने का अधिक लुभावना तरीका पूछता हूं तो मैं पूछता हूं। – Marko

+0

यह भी ध्यान रखें कि बंद होने के हाल के संस्करणों में आपको एक जोड़ने की आवश्यकता है। टॉडो ब्लॉक में सदस्य फ़ंक्शन कॉल के सामने। –

+0

@ जेम्स - – dsm

16

यदि आप जीयूआई प्रोग्रामिंग करना चाहते हैं तो मैं Temperature Converter या the ants colony पर इंगित करूंगा।

स्विंग में कई चीजें उप-वर्गीकरण द्वारा की जाती हैं, खासकर यदि आप कस्टम घटक बना रहे हैं। इसके लिए दो आवश्यक कार्य/मैक्रोज़ हैं: proxy और gen-class

अब मैं समझता हूं कि आप अधिक लिस्पी तरीके से कहां जा रहे हैं। मुझे नहीं लगता कि अभी तक ऐसा कुछ भी है। मैं दृढ़ता से एक भव्य जीयूआई-बिल्डिंग फ्रेमवर्क ए-ला CLIM बनाने की कोशिश करने के खिलाफ सलाह दूंगा, लेकिन कुछ और लिस्पी करने के लिए: अपने स्विंग एप्लिकेशन को लिखना शुरू करें और मैक्रोज़ के साथ अपने सामान्य पैटर्न को सारणीबद्ध करें। ऐसा करने पर आप अपनी तरह के जीयूआई लिखने के लिए एक भाषा के साथ समाप्त हो सकते हैं, या शायद कुछ बहुत ही सामान्य सामान जिन्हें साझा और विकसित किया जा सकता है।

क्लोजर में जीयूआई लिखते समय आप जो कुछ खो देते हैं वह मैटिस जैसे टूल का उपयोग होता है। यह जावा (जीयूआई) में कुछ हिस्सों और क्लोजर (तर्क) में कुछ हिस्सों को लिखने के लिए एक मजबूत संकेत हो सकता है। जो वास्तव में तर्क के रूप में समझ में आता है आप मैक्रोज़ का उपयोग करके अपने तर्क के लिए एक भाषा बनाने में सक्षम होंगे और मुझे लगता है कि जीयूआई के मुकाबले कहीं ज्यादा फायदा होगा। जाहिर है, यह आपके आवेदन पर निर्भर करता है।

+2

को प्रतिबिंबित करने के लिए उत्तर संपादित करें मैटिससे खोने के बारे में चिंता न करें। आप http://www.miglayout.com/ का उपयोग कर सकते हैं, जो इतना शक्तिशाली है कि आप हाथ से लेआउट कर सकते हैं। – tomjen

+0

आप क्लोजर के साथ मैटिस का उपयोग कर सकते हैं, क्योंकि उत्पन्न कोड केवल जावा कोड है जिसे क्लोजर द्वारा सहजता से एक्सेस किया जा सकता है। वास्तव में उस जगह के लिए एक ट्यूटोरियल है ... – Rayne

+3

मुझे आश्चर्य है कि जब हमें पहला क्लोजर-आउटपुट जीयूआई डिजाइनर मिलता है। Homoiconicity के कारण, जेनरेट कोड भी बुरा नहीं होना चाहिए! – progo

1

क्लोजर और एसडब्ल्यूटी जीयूआई करने के लिए सबसे अच्छा तरीका है। अनिवार्य रूप से, एसडब्ल्यूटी विकासशील सॉफ्टवेयर के लिए एक प्लग और प्ले स्टाइल दृष्टिकोण है।

+1

क्या आप एक लिंक या उदाहरण प्रदान कर सकते हैं? मुझे दिलचस्पी होगी लेकिन इस बारे में कोई जानकारी नहीं है कि कैसे शुरू किया जाए। –

+1

कार्ल, दूसरा। क्लोजर का उपयोग करके ग्रहण प्लगइन्स लिखने के तरीके पर एक अच्छा ट्यूटोरियल अच्छा होगा। –

2

मैं जावा एप्लेट विकसित कर रहा हूं जिसमें जावा में लिखे गए एप्लेट कोड को छोड़कर क्लोजर में सब कुछ लिखा गया है। एप्लेट एप्लेट मॉडल द्वारा परिभाषित उन विधियों के लिए जावा के हुक से इनिट, पेंट इत्यादि के क्लोजर कोड के कॉलबैक का आह्वान करता है। तो कोड 99.9 99 प्रतिशत क्लोजर होने के समाप्त होता है और आपको सबसे ज्यादा भाग के लिए छोटे जावा टुकड़े के बारे में सोचना नहीं है।

इस दृष्टिकोण में कुछ कमीएं हैं, जिन्हें मैं क्लोजर Google समूह पर अधिक विस्तार से चर्चा करने की आशा करता हूं। मुझे लगता है कि क्लोजर डेवलपर्स को अनुप्रयोगों के निर्माण का मूल तरीका शामिल करना चाहिए। वर्तमान में आप आरईपीएल से जो भी जीयूआई सामान पसंद करते हैं, लेकिन यदि आप एक डिलिवरेबल जीयूआई एप्लीकेशन चाहते हैं, तो क्लोजर कोड को कॉल करने के लिए कुछ जावा लिखना आवश्यक है। साथ ही, यह जावा ऐप्पल की वास्तुकला की तरह दिखता है जो क्लोजर के अधिक बेवकूफ सर्वोत्तम प्रथाओं के बाहर आपको मजबूर करता है, आपको म्यूटेबल राज्य आदि का उपयोग करने की आवश्यकता होती है।

लेकिन साथ ही, मैं अभी तक क्लोजर के साथ बहुत दूर नहीं हूं और यह यह मामला हो सकता है कि यह संभव है और मैंने अभी तक यह नहीं खोजा है कि इसे सही तरीके से कैसे किया जाए।

6

कुछ सेल (एक ला Kenny Tilton's Cells) कार्यान्वयन के बारे में talk on the mailing list रहा है। यह जीयूआई प्रोग्रामिंग करने के लिए एक बहुत साफ तरीका है।

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

आपका विचार अलग-अलग होगा लेकिन उम्मीद है कि उपर्युक्त आपको कुछ विचार देता है।

+0

ग्रोवी स्विंगबिल्डर डीएसएल क्लोजर में अनुवाद की तरह दिखता है। – Marko

+0

@ dev-er-dev यह बहुत संभव है, मैंने कभी भी ग्रोवी का उपयोग नहीं किया है, लेकिन महान दिमाग एक जैसे काम करते हैं :) – tomjen

+1

@ राल्फ, आह, बिंदु शायद "म्यू" है। –

8

clojure योगदान में MigLayout के लिए एक आवरण है। आप http://gist.github.com/261140 भी देख सकते हैं। मैं मूल रूप से जो भी कोड लिख रहा हूं उसे जोड़ रहा हूं क्योंकि मैं स्विंग/माइगलेआउट सीख रहा हूं। एक 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 और जे एस libaries के अरबों आप की जरूरत में से किसी को यूआई कुछ भी का उपयोग कर विकसित करना। यदि आप लगातार ब्राउज़र व्यवहार और "डेस्कटॉप ऐप look'n'feel" चाहते थे तो आप bundle chrome with your app कर सकते थे।

यह कैसे Light Table वितरित किया जाता है हो रहा है।

+0

यह बहुत अच्छा है, लेकिन उचित पोर्ट निर्धारित करना प्रत्येक क्लाइंट मशीन – scape

5

मैं नहीं बल्कि clojurefx के लिए जाना होगा, यह थोड़ा समय से पहले है, लेकिन यह काम करता है और आप समय बचाता है।

मैं झूला के साथ मेरी जीयूआई शुरू किया और फिर clojurefx में एक और घटक की कोशिश की।

मैं दोनों समाप्त कर दिया है, और मुझे विश्वास है कि मैं clojurefx झूला एक refactor करने के लिए जा रहा हूँ कर रहा हूँ।

सब के बाद, JavaFX आगे जाने के लिए रास्ता है।

यह देखा जाने से हल्का लगता है। या कम से कम, इसे लिखना ..

बाइंडिंग काम, श्रोताओं का काम, अधिकांश घटक काम, अन्यथा, उस विशेष मामले और नौकरी के लिए एक निर्माता बनाने के लिए बस मैक्रोज़ में से एक का उपयोग करें। या, यदि आपको यह मुश्किल लगता है, तो जावा में कुछ विधियां लिखें और clojurefx को बेहतर बनाने में सहायता मांगें।

जिस व्यक्ति ने क्लोजरफैक्स लिखा था वह इस समय व्यस्त है, लेकिन आप परियोजना को फोर्क कर सकते हैं और कुछ सुधार कर सकते हैं।

+0

पर मुश्किल हो सकता है क्या जावाएफएक्स ने अभी तक बहुत देशी नहीं दिखने की समस्याओं को हल किया है? गंभीर सवाल, क्योंकि जब मैंने पहली बार इसे चेक आउट किया था, तो यह बहुत समय पहले था, और स्विंग की तुलना में यह कम सही दिखता था। – Trejkaz

3

मैं अपने आप को स्विंग के साथ Clojure में एक जीयूआई लेखन का एक ही प्रश्न पूछा और इस पुस्तकालय के साथ आया था:

https://github.com/jonasseglare/signe

यह आप एक ही Clojure डेटा के अंदर लिपटे संरचना के रूप में आपके डोमेन मॉडल का प्रतिनिधित्व उपयोग करने देता है एक परमाणु

उदाहरण यहाँ देखें: https://github.com/jonasseglare/signe/blob/master/src/signe/examples.clj

1

मेरे वरीय Clojure यूआई पर्यावरण IO.js (Node for ES6) + Electron (Container) + Quiescent (ReactJS wrapper) उपयोग करता है।

+0

यह जटिल हो सकता है, लेकिन मैं अभी भी पूछना चाहता हूं: क्या आप इन टुकड़ों के साथ शुरू करने के तरीके पर एक उदाहरण प्रदान कर सकते हैं? या वर्णन करें कि आपके द्वारा वर्णित उन ढांचे/पुस्तकालयों में से किस एप्लिकेशन का उपयोग किया जाएगा? – Zelphir

1

इसलिए मैंने इस सूची में टिमोथी बल्रिज (हलगिरी) से एफएन-एफएक्स नहीं देखा। यह क्लोजर लाइब्रेरी है जो जावाएफएक्स पर एक कार्यात्मक अबास्ट्रक्शन प्रदान करती है।

यह https://github.com/halgari/fn-fx पर गिथब पर पाया जा सकता है।

का उपयोग करने के लिए, सुनिश्चित करें कि आप जावा (1.8 90 +) के हाल के एक संस्करण का उपयोग कर रहे हैं और अपने project.clj के लिए निम्न जोड़कर GitHub रेपो के लिए एक निर्भरता जोड़ें:

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

मैं कोशिश की है, और यह बॉक्स से बाहर काम करता है।

संबंधित मुद्दे

 संबंधित मुद्दे