ClojureでGUIを実行する最良の方法は何ですか?
-
04-07-2019 - |
解決
Seesaw をお勧めします。
REPLベースのチュートリアルは、JavaやSwingの知識がないことを前提としています。
Seesawは@tomjenが提案するものと非常に似ています。 「こんにちは、世界」は次のとおりです。
(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プログラミングを行う場合は、 Temperature Converter を参照してください。またはアリのコロニー。
特にカスタムコンポーネントを作成する場合、Swingの多くの処理はサブクラス化によって行われます。そのためには、 proxy と gen-class 。
今、私はあなたがよりリスピーな方法でどこに向かっているのか理解しています。まだそのようなものはないと思います。壮大なGUI構築フレームワークa-la CLIM を構築しようとすることを強くお勧めしますが、何かを行うには詳細Lispy:Swingアプリケーションの作成を開始し、マクロを使用して一般的なパターンを抽象化します。これを行うと、GUIの種類を記述したり、共有したり拡張したりできる非常に汎用的なものを作成するための言語になる可能性があります。
ClojureでGUIを作成するときに失うことの1つは、マティスなどのツールの使用です。これは、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サイトの相互運用性セクションを見る価値があります。
まだ誰も提案していないので、私はそうします:UIプラットフォームとしてのブラウザー。 HTTPサーバーを含むClojureでアプリを作成し、HTMLから hiccup 、ClojureScript、その他必要な数十億のJSライブラリー。一貫したブラウザの動作と「デスクトップアプリのルックアンドフィール」が必要な場合クロムをアプリにバンドルできます。
これは、ライトテーブルの配布方法のようです。
clojure contribにはMigLayoutのラッパーがあります。 この要点もご覧ください。基本的には、swing / miglayoutを学習しているときに、書いているコードは何でも付けています。
dsmの例は、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)))
いくつかのセルについて、メーリングリストで話しています a la Kenny Tilton's Cells )の実装。これは、GUIプログラミングを行うための非常にきちんとした方法です。
clojurefxを選びたいのですが、それは少し時期尚早ですが、動作して時間を節約します。
seesawでGUIを起動し、clojurefxで別のコンポーネントを試しました。
両方を終了しました。シーソーの1つをclojurefxにリファクタリングすることを確信しています。
結局のところ、JavaFXは前進する方法です。
シーソーよりも軽く感じます。または少なくとも、それを書いてください。
バインディングが動作し、リスナーが動作し、ほとんどのコンポーネントが動作します。それ以外の場合は、マクロの1つを使用して、特定のケースと実行されたジョブのコンストラクターを作成します。または、難しいと思う場合は、Javaでいくつかのメソッドを記述し、clojurefxを改善するための助けを求めてください。
clojurefxを書いた人は現在忙しいですが、プロジェクトを分岐して修正することができます。
別の非常に基本的なスイングラッピングの例を次に示します。
; 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)))
Swingを使用してClojureでGUIを作成するのと同じ質問を自問し、ライブラリ signe を作成しました
これを使用すると、ドメインモデルをアトム内にラップされた単一のClojureデータ構造として表すことができます。
例を参照こちら
Javaで書かれたアプレットコードを除き、すべてがClojureで書かれたJavaアプレットを開発しています。アプレットは、アプレットモデルによって定義されたメソッドのjavaのフックからClojureコードのinit、paintなどのコールバックを呼び出します。したがって、コードは最終的に99.999パーセントのClojureになり、ほとんどの場合、小さなJavaの部分についてまったく考える必要はありません。
このアプローチにはいくつかの欠点がありますが、Clojure Googleグループについて詳しく説明したいと思います。 Clojureの開発者は、アプリケーションを構築するネイティブな方法を含めるべきだと思います。現在、REPLから好きなGUIを実行できますが、成果物のGUIアプリケーションが必要な場合は、Clojureコードを呼び出すJavaを記述する必要があります。また、Javaアプレットのアーキテクチャは、Clojureのより慣用的なベストプラクティスの範囲外にいるため、可変状態などを使用する必要があります。
しかし、私はまだClojureにそれほど詳しくはありません。それが可能であり、正しく行う方法をまだ発見していない可能性があります。
したがって、このリストにはTimothy Baldridge(halgiri)の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に反映されるようにしました。デスクトップアプリケーションだけが唯一の方法ではないと言っているだけです:)
私の好みのClojure UI環境では、 IO.js(ES6のノード) + 電子(コンテナ) + 静止( ReactJSラッパー)。