web-dev-qa-db-ja.com

ClojureでGUIを実行する最良の方法は何ですか?

Clojure でGUIを実行する最良の方法は何ですか?

機能的な Swing または [〜#〜] swt [〜#〜] ラッパーの例はありますか?あるいは、マクロロジーを使用して s-expressions に簡単にラップできる JavaFX 宣言型GUI記述との統合ですか?

チュートリアルはありますか?

145
Marko

Seesaw をお勧めします。

これはREPLベースのチュートリアルです JavaまたはSwingの知識がないことを前提としています。


シーソーは、@ 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!)
116
Dave Ray

Stuart Sierraは最近、clojure(およびswing)を使用したGUI開発に関する一連のブログ投稿を公開しました。ここから始めてください: http://stuartsierra.com/2010/01/02/first-steps-with-clojure-swing

32
steglig

GUIプログラミングを行う場合は、 温度変換器 または アリのコロニー を指定します。

特にカスタムコンポーネントを作成する場合、Swingの多くのことはサブクラス化によって行われます。そのために、2つの重要な関数/マクロがあります: proxygen-class

今、私はあなたがよりLispyの方法でどこに向かっているのか理解しています。そのようなものはまだないと思います。大規模なGUI構築フレームワークa-la [〜#〜] clim [〜#〜] を構築しようとすることは強くお勧めしますが、もっとLispyを実行するには:Swingアプリケーションと抽象の記述を開始しますマクロを使用して一般的なパターンを作成します。これを行うと、GUIの種類を記述したり、共有したり拡張したりできる非常に汎用的なものを作成するための言語が作成される場合があります。

ClojureでGUIを作成するときに失うものの1つは、Matisseなどのツールの使用です。これは、Java(GUI))の一部とClojure(ロジック)の一部を書くための強力なポイントになる可能性があります。実際に構築できるロジックのように理にかなっていますマクロを使用したあなたの種類のロジックのための言語であり、GUIを使用するよりも多くのメリットがあると思います。

16
pupeno

これから ページ

(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サイトの 相互運用性 セクションを見る価値があります。

14
dsm

まだ誰もそれを提案しなかったので、私はそうします:UIプラットフォームとしてのブラウザ。 HTTPサーバーを含むClojureでアプリを記述し、HTMLから hiccup 、ClojureScript、必要な数十億のJSライブラリまで、UIを開発できます。一貫したブラウザーの動作と「デスクトップアプリのルックアンドフィール」が必要な場合は、 バンドルchromeアプリで を使用できます。

これは、 Light Table がどのように配布されるかと思われます。

14

Clojure contribにはMigLayoutのラッパーがあります。 this Gist もご覧ください。基本的には、swing/miglayoutを学んでいるので、書いているコードは何でも書いています。

contrib.swing-utilsを使用してdsmの例をリッピーな方法で書き直した

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

メーリングリストで話す いくつかのCells(a Kenny Tilton's Cells )の実装がありました。これは、GUIプログラミングを行うための非常にきれいな方法です。

6
Joe W.

Clojurefxに行きたいのですが、それは少し時期尚早ですが、動作し、時間を節約します。

シーソーでGUIを起動し、clojurefxで別のコンポーネントを試しました。

私は両方を終えました、そして、私はclojurefxにシーソーをリファクタリングするつもりだと確信しています。

結局のところ、JavaFXは前進する方法です。

シーソーよりも軽い感じがします。または少なくとも、それを書いて..

バインディングが動作し、リスナーが動作し、ほとんどのコンポーネントが動作します。それ以外の場合は、マクロの1つを使用して、特定のケースおよび実行されるジョブのコンストラクターを作成します。または、難しい場合は、Javaでいくつかのメソッドを記述し、clojurefxを改善するための助けを求めてください。

Clojurefxを書いた人は現在忙しいですが、プロジェクトを分岐して修正することができます。

5

次に、もう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)))
4
Jeroen Dirks

Swingを使用してClojureでGUIを作成するのと同じ質問を自問し、ライブラリを考案しました signe

ドメインモデルを、アトム内にラップされた単一のClojureデータ構造として使用できます。

例を参照してください here

3
Rulle

Javaで記述されたアプレットコードを除くすべてがClojureで記述されているJavaアプレットを開発しています。アプレットはJavaからClojureコードのinit、Paintなどのコールバックを呼び出しますアプレットモデルで定義されているメソッドのフックです。したがって、コードは最終的に99.999パーセントのClojureとなり、ほとんどの場合、小さなJavaピースについて考える必要はありません。

このアプローチにはいくつかの欠点がありますが、Clojure Googleグループについて詳しく説明したいと思います。 Clojureの開発者は、アプリケーションを構築するネイティブな方法を含めるべきだと思います。現在、REPLから好きなGUIを実行できますが、成果物のGUIアプリケーションが必要な場合は、Clojureコードを呼び出すためにいくつかのJavaを記述する必要があります。また、 Javaアプレットの種類は、Clojureのより慣用的なベストプラクティスの外に強制的に移動し、可変状態を使用する必要があるなど.

しかし、また、私はまだClojureとそれほど仲がよくなく、それが可能であるかもしれません、そして、私はちょうどそれを正しくする方法をまだ発見していません。

2
Robert Levy

ですから、このリストには、ティモシーボールドリッジ(ハルギリ)の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"]]

私はそれを試してみましたが、すぐに動作します。

2
Bill Barnhill

ClojureとSWTは、GUIを実行するための最良のアプローチです。基本的に、SWTはプラグアンドプレイスタイルのソフトウェア開発アプローチです。

1
Berlin Brown

公式なものはないと思いますが、個人的には、私が世界で最も強力な言語の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})])

あなたの考えは異なりますが、これがうまくいけば上記のアイデアが得られるはずです。

1
tomjen

私が好むClojure UI環境では、 IO.js(ES6のノード) + 電子(コンテナー) + Quiescent(ReactJSラッパー) を使用します。

1
T.W.R. Cole

あなたは古典的なデスクトップソリューションをほのめかしていることを知っていますが、Webはclojureに非常によく適合しています。すべてが接続された完全なオーディオアプリケーションを作成し、オーディオフォルダに音楽を追加すると、Web UIに反映されるようにしました。デスクトップアプリケーションだけが唯一の方法ではないと言っているだけです:)

1