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


回答:


121

シーソーをお勧めします。

これは、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!)

2
Swingを楽しくする?彼らはそれは不可能だと言った!
Michael Bylstra、2013年

9
謙虚である必要はありません-あなたはこれをとても誇りに思うことができます!+1!
mydoghasworms 2013

7
-1:コードにバグがあります。「Hello、World」ではなく「Hello、Seesaw」と表示されています。</ジョーク>
Thomas Eding 14

1
本当に?スイング?これにより、Swingが提供する機能に開発者が制限されませんか?Clojureは、どういうわけかアプリケーションを古く見えないようにしますか、それとも、Swingが弱いすべての領域を何らかの形で改善しますか?私はバインディングとMVC、およびSwing自体が現在提供しているすべての「新しい」ものについて話しています。Clojureの言語機能によって何らかの方法で修正されますか?
Zelphir Kaltstahl、2016

1
彼は特にSwingに焦点を当てた抽象化を選択しました。問題ありません...
Kenogu Labz


16

GUIプログラミングを実行する場合は、温度コンバーターまたはアリのコロニーをポイントしますます。

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

これで、Lispyの方法がどんどん進んでいくところがわかりました。そのようなものはまだないと思います。壮大なGUI構築フレームワークa-la CLIMを構築しようとしないことを強くお勧めしますしますが、Lispyをさらに強化するために、Swingアプリケーションの作成を開始し、マクロで一般的なパターンを抽象化します。そうするとき、あなたはあなたの種類のGUIを書くための言語、あるいはおそらく共有して成長することができるいくつかの非常に一般的なもので終わるかもしれません。

ClojureでGUIを作成するときに失うものの1つは、Matisseなどのツールの使用です。これは、Java(GUI)で一部を記述し、Clojure(ロジック)で一部を記述することを強く示しています。これは、ロジックのように実際に理にかなっています。マクロを使用して、ある種のロジック用の言語を構築することができます。GUIを使用するよりも、そこに得られるものは他にもあると思います。明らかに、それはあなたのアプリケーションに依存します。


2
マチスを失うことを心配しないでください。手作業でレイアウトできるほど強力なmiglayout.comを使用できます。
tomjen

生成されるコードはJavaコードであり、Clojureからシームレスにアクセスできるため、ClojureでMatisseを使用できます。実際にはどこかにそのためのチュートリアルがあります...
Rayne

3
最初のclojure出力GUIデザイナはいつ入手できるのでしょうか。同義性により、生成されたコードは悪くないはずです!
nperson325681 2010年

15

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

これがライトテーブルの配布方法のようです。


これはすばらしいことですが、適切なポートを決定することは、すべてのクライアントマシンでトリッキーになる可能性があります
2013

14

このページから:

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


3
ええ、私はあなたが直接Swingを使用することにフォールバックできることを知っていますが、私はそれを行うためのよりリッシーな方法があるかどうか尋ねました。
マルコ

また、クロージャーの最新バージョンでは、を追加する必要があることにも注意してください。todoブロックのメンバー関数呼び出しの前。
Jeroen Dirks、

8

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


6

私はむしろclojurefxに行きたい、それは少し時期尚早ですが、それは機能し、あなたの時間を節約します。

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

両方を完了し、シーソーをclojurefxにリファクタリングすると確信しています。

結局のところ、JavaFXは先へ進む方法です。

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

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

clojurefxを書いた人は現在忙しいですが、プロジェクトをフォークしていくつかの修正を行うことができます。


JavaFXはまだネイティブに見えないという問題を解決しましたか?私が最初にチェックアウトしたとき、それはずっと前のことであり、Swingよりも正確に見えなかったので、深刻な質問です。
トレカズ2017

4

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

3

Swingを使用してClojureでGUIを作成することについて同じ質問をして、ライブラリーsigneを思い付きました

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

こちらの例をご覧ください


2

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

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

しかし、私はまだClojureとそれほど遠くないので、それが可能であり、まだそれを正しく行う方法をまだ発見していない場合があるかもしれません。


2

1
これは複雑かもしれませんが、私はまだ質問したいと思います:これらの部分を開始する方法の例を提供できますか?または、アプリケーションのどの部分が、あなたが言及したそれらのフレームワーク/ライブラリのどれによって処理されるか説明しますか?
Zelphir Kaltstahl、2016

2

ティモシーボールドリッジ(ハルギリ)の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"]]

私はそれを試しました、そしてそれは箱から出してそのまま動作します。


1

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


1
リンクまたは例を提供できますか?興味はあるけど、どうやって始めたらいいのかわからない。
Carl Smotricz、2009年

1
カール、2番目。clojureを使用してEclipseプラグインを作成する方法に関する優れたチュートリアルは、かなり良いでしょう。
Egon Willighagen、2010年

1

私は公式のものはないと思いますが、個人的には、私が世界で最も強力な言語の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に翻訳されたGroovy SwingBuilder dslのように見えます。
マルコ

@ dev-er-devそれは非常に可能です。私はgroovyを使用したことがありませんが、素晴らしい心は同じように
行動し

1

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.