Question

Quelle est la meilleure façon de créer des interfaces graphiques dans Clojure ?

Existe-t-il un exemple de ou SWT wrapper? Ou bien une intégration avec la description de JavaFX pouvant être facilement encapsulée dans expressions s à l'aide d'une certaine macrologie?

Des tutoriels?

Était-ce utile?

La solution

Je suggérerai humblement Seesaw .

Voici un tutoriel basé sur REPL qui ne suppose aucune connaissance de Java ni de Swing.

Seesaw ressemble beaucoup à ce que suggère @tomjen. Voici "Bonjour à tous":

(use 'seesaw.core)

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

et voici l'exemple de @Abhijith et @ dsm, traduit littéralement:

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

Autres conseils

Stuart Sierra a récemment publié une série de billets de blog sur le développement d’interface graphique avec clojure (et swing). Commencez ici: http://stuartsierra.com/2010/ 01/02 / premiers-pas-avec-clojure-swing

Si vous voulez programmer avec une interface graphique, je vous inviterais à convertisseur de température . ou la colonie de fourmis .

De nombreuses opérations dans Swing sont effectuées par sous-classification, en particulier si vous créez des composants personnalisés. Pour cela, il existe deux fonctions / macros essentielles: proxy et classe gen .

Maintenant, je comprends où vous allez avec la manière la plus lispy. Je ne pense pas qu'il y ait encore quelque chose comme ça. Je vous déconseille vivement de créer un grandiose framework de construction d’interface graphique CLIM , mais faites quelque chose plus Lispy: commencez à écrire votre application Swing et à résumer vos motifs courants avec des macros. En faisant cela, vous pouvez vous retrouver avec un langage pour écrire votre type d’IUG, ou peut-être des informations très génériques qui peuvent être partagées et développées.

Une des choses que vous perdez en écrivant les interfaces graphiques dans Clojure est l’utilisation d’outils comme Matisse. Cela peut être un point fort d’écrire des parties en Java (l’interface graphique) et d’autres en Clojure (la logique). Ce qui est logique, car dans la logique, vous serez capable de construire un langage pour votre type de logique en utilisant des macros et je pense qu’il ya plus à gagner que dans l’interface graphique. Évidemment, cela dépend de votre application.

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

Et bien sûr, il serait utile de consulter la section sur l'interopérabilité du site Web de clojure.

Personne ne l’a encore suggéré. Je vais donc: Navigateur comme plate-forme d’interface utilisateur. Vous pouvez écrire votre application dans Clojure, y compris un serveur HTTP, puis développer l'interface utilisateur en HTML, en passant de HTML à hiccup , de ClojureScript et de les milliards de bibliothèques JS dont vous avez besoin. Si vous souhaitez un comportement de navigateur cohérent et une "apparence de bureau", vous pouvez intégrer chrome à votre application .

Cela semble être le mode de distribution de la Light Table .

Il existe un wrapper pour MigLayout dans clojure contrib. Vous pouvez également consulter cet élément essentiel . En gros, je mets en place le code que j'écris au fur et à mesure que j'apprends le swing / miglayout.

L'exemple de dsm réécrit de manière lispy en utilisant 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)))

Il y a eu une discussion sur la liste de diffusion à propos de quelques cellules ( a la Les cellules de Kenny Tilton ). C’est une très bonne façon de faire de la programmation graphique.

Je préférerais clojurefx, c'est un peu prématuré, mais ça marche et vous fait gagner du temps.

J'ai commencé mon interface graphique avec une balançoire à bascule, puis j'ai essayé un autre composant dans clojurefx.

J'ai fini les deux et je suis convaincu que je vais refactoriser celui de bascule en clojurefx.

Après tout, JavaFX est la voie à suivre.

Il semble plus léger que la balançoire. Ou du moins, l'écrire ..

Les liaisons fonctionnent, les écouteurs fonctionnent, la plupart des composants fonctionnent, sinon utilisez simplement l’une des macros pour créer un constructeur pour ce cas particulier et cette tâche effectuée. Ou, si cela vous est difficile, écrivez quelques méthodes en Java et demandez de l'aide pour améliorer clojurefx.

Le gars qui a écrit clojurefx est occupé en ce moment, mais vous pouvez créer le projet et effectuer quelques corrections.

Voici un autre exemple très simple d'habillage de swing:

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

Je me suis posé la même question pour écrire une interface graphique dans Clojure avec Swing et je suis arrivé à la bibliothèque signe

Il vous permet d’utiliser votre modèle de domaine comme une seule structure de données Clojure intégrée à un atome.

Voir les exemples ici .

Je développe une applet Java dans laquelle tout est écrit en Clojure à l'exception du code de l'applet, écrit en Java. L'applet appelle les rappels d'init, paint, etc. du code Clojure à partir des points d'ancrage de Java pour les méthodes définies par le modèle d'applet. Le code est donc à 99,999% Clojure et vous n'avez pas à penser à la minuscule pièce Java pour la plupart.

Cette approche présente des inconvénients que je souhaite aborder plus en détail dans le groupe Google Clojure. Je pense que les développeurs Clojure devraient inclure un moyen natif de créer des applications. Actuellement, vous pouvez faire ce que vous voulez dans l'interface utilisateur graphique du REPL, mais si vous voulez une application graphique livrable, il est nécessaire d'écrire du Java pour appeler le code Clojure. En outre, il semble que l'architecture d'un applet Java vous oblige en quelque sorte à sortir des meilleures pratiques plus idiomatiques de Clojure, vous obligeant à utiliser l'état mutable, etc.

Mais aussi, je ne suis pas encore très loin de Clojure et il se peut que ce soit possible et je n’ai pas encore découvert comment le faire correctement.

Donc, je n'ai pas vu Fn-Fx sur cette liste, de Timothy Baldridge (halgiri). C'est une bibliothèque Clojure fournissant une abstraction fonctionnelle sur JavaFX.

Vous pouvez le trouver sur Github à l'adresse https://github.com/halgari/fn-fx .

Pour l'utiliser, assurez-vous d'utiliser une version récente de Java (1.8 90+) et ajoutez une dépendance au référentiel github en ajoutant ce qui suit à votre projet.clj:

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

Je l'ai essayé, et cela fonctionne immédiatement.

Clojure et SWT constituent la meilleure approche pour réaliser des interfaces graphiques. SWT est essentiellement une approche plug-and-play permettant de développer des logiciels.

Je ne pense pas qu'il existe un langage officiel, mais personnellement, je tirerais parti du fait que j'utilise l'un des langages les plus puissants du monde et imaginais simplement à quoi ressemblerait le code gui parfait:

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

Votre idée serait différente, mais espérons que ce qui précède vous donne une idée.

Je sais que vous faites allusion à des solutions de bureau classiques, mais le Web s’adapte plutôt bien à clojure. J'ai écrit une application audio complète dans laquelle tout est branché, de sorte que si vous ajoutez de la musique dans le dossier audio, elle est reflétée dans l'interface utilisateur Web. Il suffit de dire que l’application de bureau n’est pas le seul moyen:)

Mon environnement Clojure UI préféré utilise IO.js (nœud pour ES6) + Electron (conteneur) + Quiescent ( ReactJS wrapper) .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top