回答:
シーソーをお勧めします。
これは、JavaやSwingの知識がないことを前提としたREPLベースのチュートリアルです。
シーソーは、@ tomjenの提案によく似ています。こちらが「Hello、World」です。
(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!)
Stuart Sierraは最近、clojure(およびswing)を使用したGUI開発に関する一連のブログ投稿を公開しました。ここから始めましょう:http : //stuartsierra.com/2010/01/02/first-steps-with-clojure-swing
GUIプログラミングを実行する場合は、温度コンバーターまたはアリのコロニーをポイントしますます。
Swingの多くのことは、特にカスタムコンポーネントを作成する場合、サブクラス化によって行われます。そのためには、2つの重要な関数/マクロがあります:プロキシとgen-classです。
これで、Lispyの方法がどんどん進んでいくところがわかりました。そのようなものはまだないと思います。壮大なGUI構築フレームワークa-la CLIMを構築しようとしないことを強くお勧めしますしますが、Lispyをさらに強化するために、Swingアプリケーションの作成を開始し、マクロで一般的なパターンを抽象化します。そうするとき、あなたはあなたの種類のGUIを書くための言語、あるいはおそらく共有して成長することができるいくつかの非常に一般的なもので終わるかもしれません。
ClojureでGUIを作成するときに失うものの1つは、Matisseなどのツールの使用です。これは、Java(GUI)で一部を記述し、Clojure(ロジック)で一部を記述することを強く示しています。これは、ロジックのように実際に理にかなっています。マクロを使用して、ある種のロジック用の言語を構築することができます。GUIを使用するよりも、そこに得られるものは他にもあると思います。明らかに、それはあなたのアプリケーションに依存します。
このページから:
(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のWebサイトの相互運用性のセクションも一見の価値があります。
clojure contribにはMigLayoutのラッパーがあります。また、見とることができ、この要点を。私は基本的に、swing / miglayoutを学習しているときに、自分が書いているコードをすべて上げています。
dsmの例をcontrib.swing-utilsを使用してlispyな方法で書き直した
(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)))
いくつかのCells(la Kenny TiltonのCells)実装についてのメーリングリストでの話がありました。これは、GUIプログラミングを行うのにかなり便利な方法です。
私はむしろclojurefxに行きたい、それは少し時期尚早ですが、それは機能し、あなたの時間を節約します。
シーソーでGUIを起動し、clojurefxの別のコンポーネントを試しました。
両方を完了し、シーソーをclojurefxにリファクタリングすると確信しています。
結局のところ、JavaFXは先へ進む方法です。
シーソーより軽い感じです。または、少なくとも、それを書きます。
バインディングは機能し、リスナーは機能し、ほとんどのコンポーネントは機能します。それ以外の場合は、マクロの1つを使用して、特定のケースと実行されるジョブのコンストラクターを作成します。または、難しいと感じる場合は、Javaでいくつかのメソッドを記述し、clojurefxの改善に協力を求めてください。
clojurefxを書いた人は現在忙しいですが、プロジェクトをフォークしていくつかの修正を行うことができます。
次に、もう1つの非常に基本的なスイングラッピングの例を示します。
; 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)))
私は、Javaで書かれたアプレットコードを除いて、すべてがClojureで書かれたJavaアプレットを開発しています。アプレットは、アプレットモデルで定義されているメソッドのjavaのフックから、init、paintなどのClojureコードのコールバックを呼び出します。したがって、コードは最終的には99.999%のClojureであり、ほとんどの場合、小さなJavaの部分について考える必要はまったくありません。
このアプローチにはいくつかの欠点があります。ClojureのGoogleグループについて詳しく説明したいと思います。Clojure開発者は、アプリケーションを構築するネイティブな方法を含める必要があると思います。現在、REPLから好きなGUIを実行できますが、成果物のあるGUIアプリケーションが必要な場合は、Clojureコードを呼び出すJavaを記述する必要があります。また、Javaアプレットのアーキテクチャーは、Clojureのより慣用的なベストプラクティスの外に強制されており、変更可能な状態を使用する必要があるなどのようです。
しかし、私はまだClojureとそれほど遠くないので、それが可能であり、まだそれを正しく行う方法をまだ発見していない場合があるかもしれません。
私が好むClojure UI環境では、IO.js(ES6のノード) + Electron(コンテナー) + Quiescent(ReactJSラッパー)を使用しています。
ティモシーボールドリッジ(ハルギリ)のFn-Fxがこのリストに表示されませんでした。これは、JavaFXの機能を抽象化したClojureライブラリです。
Githubのhttps://github.com/halgari/fn-fxにあります。
使用するには、Javaの最新バージョン(1.8 90+)を使用していることを確認し、次のコードをproject.cljに追加して、依存関係をgithubリポジトリに追加します。
:plugins [[lein-git-deps "0.0.1-SNAPSHOT"]]
:git-dependencies [["https://github.com/halgari/fn-fx.git"]]
私はそれを試しました、そしてそれは箱から出してそのまま動作します。
ClojureとSWTは、GUIを実行するための最良のアプローチです。基本的に、SWTはソフトウェアを開発するためのプラグアンドプレイスタイルのアプローチです。
私は公式のものはないと思いますが、個人的には、私が世界で最も強力な言語の1つを使用しているという事実を利用して、完璧なGUIコードがどのようになるか想像します。
(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})])
あなたの考えは異なるでしょうが、これはうまくいけば、上記はあなたにいくつかの考えを与えるでしょう。
あなたが古典的なデスクトップソリューションをほのめかしていることは知っていますが、WebはClojureに非常によく適合します。私は、すべてを接続した完全なオーディオアプリケーションを作成しました。そのため、オーディオをオーディオフォルダに追加すると、Web UIに反映されます。デスクトップアプリケーションが唯一の方法ではないことを言っているだけです:)