ClojureでGUIを実行するための最良の方法は何ですか?
機能的なSwingまたはSWTラッパーの例はありますか?または、マクロロジーを使用してS式に簡単にラップできるJavaFX宣言型GUI記述との統合ですか?
チュートリアルはありますか?
シーソーを謙虚に提案します。
これは、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は最近、CLI開発に関する一連のブログ投稿をclojure(およびswing)で公開しました。ここから始めましょう:http ://stuartsierra.com/2010/01/02/first-steps-with-clojure-swing
GUIプログラミングをしたい場合は、Temperature Converterまたはantのコロニーを指します。
Swing の多くのことは、特にカスタム コンポーネントを作成する場合に、サブクラス化によって行われます。そのために、 proxyとgen-classという 2 つの重要な関数/マクロがあります。
これで、あなたがより Lisp 的な方法でどこに向かっているのかがわかりました。そんなものはまだないと思います。CLIMのように壮大な GUI 構築フレームワークを構築しようとするのはやめるよう強くお勧めしますが、もっと Lisp 的なことをするために、Swing アプリケーションの作成を開始し、マクロを使用して一般的なパターンを抽象化します。それを行うと、あなたのようなGUIを書くための言語、または共有して成長できる非常に一般的なものになるかもしれません.
Clojure で GUI を作成する際に失うものの 1 つは、Matisse のようなツールを使用することです。これは、一部の部分を Java (GUI) で記述し、一部の部分を Clojure (ロジック) で記述することを強く示唆している可能性があります。マクロを使用してロジックの種類の言語を構築できるロジックでは、これは実際には理にかなっています。GUI を使用するよりも多くのことが得られると思います。明らかに、それはアプリケーションに依存します。
誰もまだ提案していないので、私は次のようにします。 UI プラットフォームとしてのブラウザ。HTTP サーバーを含む Clojure でアプリを作成し、HTML からhiccup、ClojureScript、必要な数十億の JS ライブラリまで、あらゆるものを使用して UI を開発できます。一貫したブラウザの動作と「デスクトップ アプリのルックアンドフィール」が必要な場合は、アプリに chrome をバンドルできます。
これがライトテーブルの配布方法のようです。
このページから:
(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 を学んでいるので、書いているコードをすべて公開しています。
contrib.swing-utils を使用して dsm の例を 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)))
これは、別の非常に基本的なスイング ラッピングの例です。
; 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)))
Clojure で Swing を使用して GUI を作成するという同じ質問を自問し、ライブラリの署名を思いつきました。
ドメイン モデルを、atom 内にラップされた単一の Clojure データ構造として表すことができます。
ここで例を参照してください。
Java で記述されたアプレット コードを除いて、すべてが Clojure で記述された Java アプレットを開発しています。アプレットは、Clojure コードの init、paint などのコールバックを、アプレット モデルによって定義されたメソッドの Java フックから呼び出します。したがって、コードは最終的に 99.999% が Clojure であり、ほとんどの場合、Java の小さな部分について考える必要はまったくありません。
このアプローチにはいくつかの欠点があります。これについては、Clojure Google Group で詳しく説明したいと考えています。私は、Clojure の開発者はアプリケーションを構築するためのネイティブな方法を含めるべきだと思います。現在、REPL から好きなように GUI を実行できますが、提供可能な GUI アプリケーションが必要な場合は、Clojure コードを呼び出す Java を作成する必要があります。また、Java アプレットのアーキテクチャは、Clojure のより慣用的なベスト プラクティスから外れて、変更可能な状態などを使用する必要があるようです。
しかしまた、私はまだ Clojure にあまり慣れていません。それは可能かもしれませんが、それを正しく行う方法をまだ発見していません。
私の好みの Clojure UI 環境では、IO.js (Node for ES6) + Electron (コンテナー) + Quiescent (ReactJS ラッパー)を使用します。
あなたが古典的なデスクトップソリューションをほのめかしていることは知っていますが、Webはclojureに非常によく適合します。オーディオフォルダに音楽を追加するとWebUIに反映されるように、すべてが接続された完全なオーディオアプリケーションを作成しました。デスクトップアプリケーションが唯一の方法ではないと言っているだけです:)
公式のものはないと思いますが、個人的には、世界で最も強力な言語の 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})])
あなたの考えは異なるかもしれませんが、これはうまくいけば、上記があなたに何らかの考えを与えるはずです.
Clojure と SWT は、GUI を実行するための最良のアプローチです。基本的に、SWT はプラグ アンド プレイ スタイルのソフトウェア開発アプローチです。