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


150

में GUIs करने का सबसे अच्छा तरीका क्या है Clojure ?

क्या कुछ कार्यात्मक स्विंग या SWT आवरण का एक उदाहरण है ? या JavaFX डिक्लेयरेटिव GUI विवरण के साथ कुछ एकीकरण जो आसानी से कुछ मैक्रोोलॉजी का उपयोग करके एस-एक्सप्रेशंस से लिपटा जा सकता है ?

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

जवाबों:


121

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

यहाँ एक REPL- आधारित ट्यूटोरियल है जो जावा या स्विंग ज्ञान नहीं मानता है।


सीसॉव बहुत कुछ @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!)

2
स्विंग बनाना मजेदार है? उन्होंने कहा कि यह संभव नहीं था!
माइकल बाइल्स्ट्रा

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

7
-1: आपके कोड में एक बग है। यह "हैलो, वर्ल्ड" के बजाय "हैलो, सीसॉ" कहता है। </ मजाक>
थॉमस Eding

1
वास्तव में? स्विंग? क्या यह डेवलपर को कार्यक्षमता की सीमा तक सीमित नहीं करता है, ऑफरिंग केवल उच्च स्तर के अमूर्त स्तर पर, यदि कोई हो? क्या क्लोजर किसी तरह अनुप्रयोगों को कम पुराना दिखता है, या क्या यह किसी भी तरह से उन सभी क्षेत्रों में सुधार करता है जिसमें स्विंग कमजोर है? मैं बाइंडिंग और एमवीसी के बारे में बात कर रहा हूं और यह सब "नया" सामान है, जो स्विंग अब प्रति प्रति प्रदान करता है। क्या यह किसी तरह से क्लोजर की भाषा सुविधाओं द्वारा तय किया गया है?
ज़ेलफिर कलस्टहल

1
उन्होंने स्विंग पर विशेष रूप से ध्यान केंद्रित करने के लिए चुना। इसके साथ कुछ भी गलत नहीं है ...
Kenogu Labz

32

स्टुअर्ट सिएरा ने हाल ही में क्लूजुर (और स्विंग) के साथ जीयूआई-विकास पर ब्लॉग पोस्टों की एक श्रृंखला प्रकाशित की है। यहाँ से शुरू करें: http://stuartsierra.com/2010/01/02/first-steps-with-clojure-swing


16

यदि आप GUI प्रोग्रामिंग करना चाहते हैं, तो मैं तापमान कनवर्टर या चींटियों कॉलोनी को इंगित करूंगा ।

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

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

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


2
मैटिस को खोने के बारे में चिंता न करें। आप miglayout.com का उपयोग कर सकते हैं , जो इतना शक्तिशाली है कि आप हाथ से लेआउट कर सकते हैं।
टॉमजेन

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

3
मुझे आश्चर्य होता है कि जब हमें पहला क्लोजर-आउटपुटिंग GUI डिज़ाइनर मिलता है। समरूपता के कारण, उत्पन्न कोड भी खराब नहीं होना चाहिए!
nperson325681

15

किसी ने अभी तक इसका सुझाव नहीं दिया है, इसलिए मैं: ब्राउज़र को यूआई प्लेटफॉर्म के रूप में देखूंगा। आप एक HTTP सर्वर सहित क्लोजर में अपना ऐप लिख सकते हैं और फिर एचटीएमएल से हिचकी , क्लोजरस्क्रिप्ट और अरबों जेएस के कई कामों का उपयोग करके यूआई विकसित कर सकते हैं । यदि आप लगातार ब्राउज़र व्यवहार और "डेस्कटॉप ऐप देखना चाहते हैं" तो आप अपने ऐप के साथ क्रोम बंडल कर सकते हैं ।

यह प्रतीत होता है कि लाइट टेबल कैसे वितरित की जाती है।


इस महान है, लेकिन उचित बंदरगाह का निर्धारण हर क्लाइंट मशीन पर मुश्किल हो सकता है
स्केप

14

इस पेज से :

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

और, निश्चित रूप से, यह क्लोजर की वेबसाइट के इंटरऑपरेबिलिटी सेक्शन को देखने लायक होगा ।


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

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

8

क्लोजर कंट्रीब में मिगलैयूट के लिए एक आवरण है। आप इस जिस्ट पर भी नज़र डाल सकते हैं । मैं मूल रूप से जो भी कोड लिख रहा हूं, वह स्विंग / माइगेलआउट सीख रहा हूं।

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


6

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

मैंने अपना GUI वॉचॉ के साथ शुरू किया और फिर क्लोजुरेफएक्स में एक और घटक की कोशिश की।

मैंने दोनों को पूरा कर लिया है, और मुझे विश्वास है कि मैं क्लोजुरेफ़क्स को सीवर्स एक को रिफ्लेक्टर करने जा रहा हूं।

आखिरकार, JavaFX आगे बढ़ने का तरीका है।

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

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

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


क्या JavaFX ने अभी तक बहुत देशी नहीं दिखने की समस्‍याओं को हल किया है? गंभीर सवाल, क्योंकि जब मैंने पहली बार इसकी जाँच की थी, तो यह बहुत समय पहले था, और यह स्विंग की तुलना में कम सही था।
तर्जुक

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

3

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

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

यहां उदाहरण देखें ।


2

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

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

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


2

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

2

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

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

उपयोग करने के लिए, सुनिश्चित करें कि आप जावा (1.8 90+) के एक हालिया संस्करण का उपयोग कर रहे हैं और अपने प्रोजेक्ट में निम्नलिखित को जोड़कर गीथूब रेपो पर निर्भरता जोड़ें:

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

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


1

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


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

1
कार्ल, दूसरा कि। क्लोजर का उपयोग करके ग्रहण प्लगइन्स लिखने का एक अच्छा ट्यूटोरियल बल्कि अच्छा होगा।
एगॉन विलिघेन

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

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


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

@ देव-एर-देव यह बहुत संभव है, मैंने कभी भी
करुणा का

1

मुझे पता है कि आप शास्त्रीय डेस्कटॉप समाधान के लिए इशारा कर रहे हैं, लेकिन वेब क्लोजर के साथ काफी फिट बैठता है। मैंने एक संपूर्ण ऑडियो एप्लिकेशन लिखा है, जहां सब कुछ हुक किया गया है ताकि यदि आप ऑडियो फ़ोल्डर में संगीत जोड़ते हैं तो यह वेब UI में परिलक्षित होता है। सिर्फ डेस्कटॉप अनुप्रयोग ही रास्ता नहीं कह रहा है :)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.