Was ist der beste Weg, um GUIs in Clojure zu erstellen?

Lesezeit: 6 Minuten

Benutzer-Avatar
Markus

Was ist der beste Weg, um GUIs in Clojure?

Gibt es ein Beispiel für einige funktionelle Schwingen oder SWT Verpackung? Oder eine Integration mit JavaFX deklarative GUI-Beschreibung, die leicht umschlossen werden kann s-Ausdrücke etwas Makrologie verwenden?

Irgendwelche Tutorials?

Benutzer-Avatar
David Ray

Ich werde demütig vorschlagen Wippe.

Hier ist ein REPL-basiertes Tutorial das setzt keinerlei Java- oder Swing-Kenntnisse voraus.


Seesaw ist dem sehr ähnlich, was @tomjen vorschlägt. Hier ist “Hallo Welt”:

(use 'seesaw.core)

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

und hier ist das Beispiel von @Abhijith und @dsm, ziemlich wörtlich übersetzt:

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

  • macht Swing Spaß? Sie sagten, es sei nicht möglich!

    – Michael Bylstra

    26. Januar 2013 um 4:15 Uhr

  • Sie müssen nicht bescheiden sein – darauf können Sie sehr stolz sein! +1!

    – Mydoghaswürmer

    22. April 2013 um 8:41 Uhr

  • -1: Es gibt einen Fehler in Ihrem Code. Es heißt “Hello, Seesaw” statt “Hello, World”.

    – Thomas Eding

    5. Februar 2014 um 17:39 Uhr


  • Wirklich? Schwingen? Beschränkt dies den Entwickler nicht auf die Funktionalität, die Swing bietet, nur auf einer höheren Abstraktionsebene, falls vorhanden? Lässt Clojure die Anwendungen irgendwie weniger veraltet aussehen oder verbessert es irgendwie alle Bereiche, in denen Swing schwach ist? Ich spreche von Bindungen und MVC und all dem “neuen” Zeug, das Swing jetzt per se bietet. Ist es irgendwie durch Sprachfeatures von Clojure behoben?

    – Zelphir Kaltstahl

    10. Februar 2016 um 1:26 Uhr

  • Er entschied sich für eine gezielte Abstraktion speziell über Swing. Daran ist nichts falsch …

    – Kenogu Labz

    10. Juli 2016 um 22:53 Uhr

Benutzer-Avatar
Steglig

Stuart Sierra hat kürzlich eine Reihe von Blogbeiträgen zur GUI-Entwicklung mit Clojure (und Swing) veröffentlicht. Beginnen Sie hier: http://stuartsierra.com/2010/01/02/first-steps-with-clojure-swing

Benutzer-Avatar
Puppe

Wenn Sie GUI-Programmierung durchführen möchten, würde ich darauf hinweisen Temperaturkonverter oder die Ameisenkolonie.

Viele Dinge in Swing werden durch Unterklassen erledigt, besonders wenn Sie benutzerdefinierte Komponenten erstellen. Dafür gibt es zwei wesentliche Funktionen/Makros: Proxy und Gen-Klasse.

Jetzt verstehe ich, wohin Sie mit dem Lispy-Weg gehen. Ich glaube so etwas gibt es noch nicht. Ich würde dringend davon abraten, ein grandioses GUI-Gebäude-Framework a-la zu bauen CLIM, aber um etwas mehr Lispy zu machen: Beginnen Sie mit dem Schreiben Ihrer Swing-Anwendung und abstrahieren Sie Ihre gemeinsamen Muster mit Makros. Wenn Sie das tun, erhalten Sie möglicherweise eine Sprache, um Ihre Art von GUIs zu schreiben, oder vielleicht einige sehr generische Dinge, die geteilt und erweitert werden können.

Eine Sache, die Sie beim Schreiben der GUIs in Clojure verlieren, ist die Verwendung von Tools wie Matisse. Das kann ein starker Hinweis darauf sein, einige Teile in Java (die GUI) und einige Teile in Clojure (die Logik) zu schreiben. Was eigentlich Sinn macht, da Sie in der Logik eine Sprache für Ihre Art von Logik mithilfe von Makros erstellen können, und ich denke, dass es dort mehr zu gewinnen gibt als mit der GUI. Natürlich hängt es von Ihrer Anwendung ab.

  • Mach dir keine Sorgen, Mattisse zu verlieren. Du kannst den … benutzen miglayout.comdas so leistungsfähig ist, dass Sie die Layouts von Hand erstellen können.

    – tomjen

    1. Oktober 2009 um 18:37 Uhr

  • Sie können Matisse mit Clojure verwenden, da der generierte Code nur Java-Code ist, auf den Clojure nahtlos zugreifen kann. Irgendwo gibt es dazu tatsächlich eine Anleitung…

    – Reyn

    1. Oktober 2009 um 22:10 Uhr

  • Ich frage mich, wann wir den ersten Clojure-Ausgabe-GUI-Designer bekommen. Aufgrund der Homoikonizität sollte der generierte Code nicht einmal schlecht sein!

    – mike3996

    24. November 2010 um 19:04 Uhr

Bisher hat es noch niemand vorgeschlagen, also werde ich: Browser als UI-Plattform. Sie könnten Ihre App in Clojure schreiben, einschließlich eines HTTP-Servers, und dann die Benutzeroberfläche mit allem von HTML bis entwickeln Schluckauf, ClojureScript und jede der Milliarden von JS-Bibliotheken, die Sie benötigen. Wenn Sie ein konsistentes Browserverhalten und ein “Desktop-App-Look’n’Feel” wünschen, können Sie dies tun Chrome mit Ihrer App bündeln.

So scheint es zu gehen Leuchttisch wird ausgeliefert.

Benutzer-Avatar
dsm

Davon Seite:

(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ürde es sich lohnen, sich das anzusehen Interoperabilität Abschnitt der Website von clojure.

  • Ja, ich weiß, dass Sie direkt auf Swing zurückgreifen können, aber ich habe gefragt, ob es einen lispyeren Weg gibt, dies zu tun.

    – Markus

    24. Oktober 2008 um 12:54 Uhr

  • Beachten Sie auch, dass Sie in den neueren Versionen von Closure eine . vor den Member-Funktionsaufrufen im Todo-Block.

    – Jeroen Dirks

    1. Oktober 2009 um 17:41 Uhr

Benutzer-Avatar
Philipp Augusto

Es gibt einen Wrapper für MigLayout in Clojure Contrib. Sie können auch einen Blick darauf werfen dieses Wesentliche. Ich stelle grundsätzlich den Code auf, den ich schreibe, während ich Swing/Miglayout lerne.

Das Beispiel von dsm wurde mit contrib.swing-utils auf eine lispelige Weise neu geschrieben

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

  • Ja, ich weiß, dass Sie direkt auf Swing zurückgreifen können, aber ich habe gefragt, ob es einen lispyeren Weg gibt, dies zu tun.

    – Markus

    24. Oktober 2008 um 12:54 Uhr

  • Beachten Sie auch, dass Sie in den neueren Versionen von Closure eine . vor den Member-Funktionsaufrufen im Todo-Block.

    – Jeroen Dirks

    1. Oktober 2009 um 17:41 Uhr

Benutzer-Avatar
Efrain Bergillos

Ich würde eher zu clojurefx greifen, es ist etwas voreilig, aber es funktioniert und spart Ihnen Zeit.

Ich habe meine GUI mit seesaw gestartet und dann eine andere Komponente in clojurefx ausprobiert.

Ich habe beide beendet und bin überzeugt, dass ich die Wippe in clojurefx umgestalten werde.

Schließlich ist JavaFX der Weg in die Zukunft.

Es fühlt sich leichter an als eine Wippe. Oder zumindest schreiben..

Bindungen funktionieren, Listener funktionieren, die meisten Komponenten funktionieren, ansonsten verwenden Sie einfach eines der Makros, um einen Konstruktor für diesen speziellen Fall zu erstellen und die Arbeit zu erledigen. Oder schreiben Sie einige Methoden in Java, wenn Sie es schwierig finden, und bitten Sie um Hilfe, um clojurefx zu verbessern.

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

  • Hat JavaFX die Probleme gelöst, noch nicht sehr nativ auszusehen? Ernsthafte Frage, denn als ich es zum ersten Mal überprüfte, war es lange her und es sah weniger korrekt aus als Swing.

    – Hakanai

    9. August 2017 um 1:05 Uhr

1342630cookie-checkWas ist der beste Weg, um GUIs in Clojure zu erstellen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy