Frage

Was ist der beste Weg, GUIs in Clojure ?

zu tun

Gibt es ein Beispiel von einigen funktionalen Swing- oder SWT Wrapper? Oder eine Integration mit JavaFX deklarative GUI Beschreibung, die leicht zu s-Ausdrücke einige macrology mit?

Alle Tutorials?

War es hilfreich?

Lösung

Ich werde demütig vorschlagen Seesaw .

Hier ist eine REPL-basierte Tutorial , die keine Java oder Swing-Kenntnisse voraussetzt.


Seesaw ist viel wie das, was @tomjen vermuten lässt. Hier ist "Hallo, Welt":

(use 'seesaw.core)

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

und hier ist @Abhijith und @ DSM Beispiel übersetzt ziemlich wörtlich:

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

Andere Tipps

Stuart Sierra kürzlich eine Reihe von Blog-Posts auf GUI-Entwicklung mit clojure (und Swing) veröffentlicht. Beginnen Sie hier: http://stuartsierra.com/2010/ 02.01 / first-step-mit-clojure-swing

Wenn Sie die GUI-Programmierung tun wollen würde ich darauf href="http://en.wikibooks.org/wiki/Clojure_Programming#Simple_GUI_:_Temperature_Converter" rel="noreferrer"> Temperature Converter zum oder die Ameisen Kolonie .

Viele Dinge in Swing werden von Unter classing getan, vor allem, wenn Sie benutzerdefinierte Komponenten erstellen. Dafür gibt es zwei wesentliche Funktionen / Makros: Proxy und gen-Klasse .

Jetzt verstehe ich, wo Sie mit dem mehr Lispy Weg gehen. Ich glaube nicht, dass es so etwas noch. Ich würde raten dringend versuchen, a-la CLIM , einen grandiosen GUI-Gebäude Rahmen zu bauen, sondern etwas zu tun mehr Lispy: beginnen Sie Ihre Swing-Anwendung und abstrakt aus Ihren gemeinsamen Mustern mit Makros zu schreiben. Wenn tun, dass Sie mit einer Sprache kann am Ende Ihre Art von GUIs, oder vielleicht einige sehr allgemeine Dinge zu schreiben, die gemeinsam genutzt werden können und wachsen.

Eine Sache, die Sie verlieren, wenn die GUIs in Clojure schreiben, ist die Verwendung von Tools wie Matisse. Das kann eine starke Zeige sein, einige Teile in Java (GUI) und einige Teile in Clojure (die Logik) zu schreiben. Das macht tatsächlich Sinn, wie in der Logik Du in der Lage sein, eine Sprache für Ihre Art von Logik zu bauen Makros und ich denke, dass es mehr gibt es zu gewinnen als mit der GUI. Offensichtlich ist es hängt von Ihrer Anwendung.

Von diesem :

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

Und natürlich wäre es an der rel="noreferrer"> Interoperabilität Abschnitt clojure Webseite.

Niemand noch vorgeschlagen es, so will ich: Browser als UI-Plattform. Sie können Ihre App in Clojure, einschließlich einem HTTP-Server schreiben und dann die Benutzeroberfläche entwickeln sich aus HTML mit irgendetwas Schluckauf , ClojureScript und einem die Milliarden von JS libaries Sie benötigen. Wenn Sie konsistente Browser Verhalten und „Desktop-App Look'n'Feel“ wollte könnte Sie Chrom Bundle mit Ihrer App .

Dies scheint zu sein, wie Light Table verteilt wird.

Es ist ein Wrapper für MigLayout in clojure contrib. Sie können auch einen Blick auf diesem Kern nehmen. Ich setze im Grunde auf, was Code ich schreibe, wie ich Swing / MigLayout lerne.

DSM Beispiel neu geschrieben in einer lispy Weise mit 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)))

Es gab Vortrag auf der Mailingliste über ein paar Zellen ( a la Kenny Tiltons Zellen ) Implementierungen. Es ist eine ziemlich nette Art und Weise GUI-Programmierung zu tun.

ich eher für clojurefx gehen würde, ist es ein bisschen verfrüht, aber es funktioniert und spart Zeit.

begann ich meine GUI mit Wippe und dann versucht, eine andere Komponente in clojurefx.

Ich habe beide fertig, und ich bin überzeugt, dass ich die Wippe ein Refactoring werde clojurefx.

Immerhin JavaFX ist der richtige Weg zu gehen.

Es fühlt sich leichter als Wippe. Oder zumindest, es zu schreiben ..

Bindungen Arbeit, Hörer arbeiten, die meisten der Komponente arbeiten, andernfalls verwenden nur eine der Makros einen Konstruktor für diesen speziellen Fall und Arbeit geleistet zu erstellen. Oder, wenn Sie es schwierig finden, schreiben Sie einige Methoden in Java und um Hilfe bitten clojurefx zu verbessern.

Der Typ, der clojurefx geschrieben hat, ist im Moment beschäftigt, aber Sie können das Projekt und einige Fehlerbehebungen gabeln.

Hier ist ein weiteres sehr einfaches Schaukel Verpackung Beispiel:

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

Ich fragte mich die gleiche Frage von einer GUI in Clojure mit Swing-Schreiben und kam mit der Bibliothek signe

Damit können Sie Ihre Domain verwenden Modell als eine einzige Clojure Datenstruktur innerhalb eines Atoms gewickelten darstellen.

Sehen Sie Beispiele hier .

Ich habe einen Java-Applet entwickelt, in dem alles in Clojure mit Ausnahme des Applet-Code geschrieben ist, die in Java geschrieben ist. Das Applet ruft die Rückrufe des Clojure Code von init, Farbe, usw. von Java Haken für die Methoden, die von dem Applet-Modell definiert sind. So endet der Code 99,999 Prozent Clojure sein und Sie müssen nicht über das kleine Java Stück denken überhaupt zum größten Teil.

Es gibt einige Nachteile bei diesem Ansatz, die ich im Detail auf der Clojure Google-Gruppe zu diskutieren hoffen. Ich denke, die Clojure Entwickler eine native Art und Weise der Erstellung von Anwendungen enthalten sollte. Derzeit können Sie tun, was GUI Zeug Sie aus dem REPL mögen, aber wenn Sie eine lieferbare GUI-Anwendung wollen, ist es notwendig, eine Java zu schreiben, die Clojure Code aufzurufen. Auch scheint es, wie die Architektur einer Java-Applet Art von Kräften Sie außerhalb von Clojure ist mehr idiomatischen Best Practices, die Sie auffordert, wandelbar Zustand zu verwenden, etc.

Aber auch, ich bin nicht sehr weit zusammen mit Clojure noch und es könnte sein, dass es möglich ist, und ich habe nur nicht entdeckt, wie machen Sie es richtig vor.

Clojure und SWT ist der beste Ansatz für das Tun GUI (s). Im Wesentlichen SWT ist ein Plug-and-Play-Stil Ansatz für die Entwicklung von Software.

Ich glaube nicht, gibt es eine offizielle, aber ich persönlich würde Vorteil der Tatsache, dass ich in der Welt der mächtigsten Sprache verwende und sich vorstellen, was die perfekte gui Code aussehen würde:

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

würde Ihre Idee unterscheiden, aber dies sollte hoffentlich über das gibt Ihnen eine Vorstellung.

Ich weiß, dass Sie für die klassischen Desktop-Lösungen sind anspielend, aber Web paßt recht gut mit clojure. Ich habe eine komplette Audio-Anwendung geschrieben, wo alles angeschlossen ist, so dass, wenn Sie Musik auf die Audio-Ordner hinzufügen, in der Web-Oberfläche reflektiert wird. Nur zu sagen, dass Desktop-Anwendung nicht der einzige Weg ist:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top