在Clojure中做GUI的最好方法是什么?

在Clojure中做GUI的最好方法是什么?

有一些function的Swing或SWT包装的例子吗? 还是与JavaFX声明性GUI描述的一些整合,可以很容易地使用一些macros观包装到sexpression式 ?

任何教程?

我会虚心地build议跷跷板 。

这里是一个基于REPL的教程 ,其中没有Java或Swing知识。


跷跷板很像@tomjen的build议。 这里是“你好,世界”:

(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编程,我会指向温度转换器或ant殖民地 。

Swing中的许多事情都是通过子类来完成的,特别是在创build自定义组件时。 为此,有两个基本的函数/macros: 代理和gen-class 。

现在我明白你要以更Lispy的方式去。 我不认为有这样的事情。 我强烈build议不要试图构build一个CLIMmacros伟的GUI构build框架,而是要做更多的Lispy:开始编写Swing应用程序,并用macros抽象出您的常见模式。 当你这样做的时候,你最终可能会用一种语言来编写你自己的graphics用户界面(GUI),或者是一些可以共享和增长的非常通用的东西。

在Clojure中编写graphics用户界面时,有一件事情就是使用像Matisse这样的工具。 这可能是一个强有力的指向,写在Java(GUI)的一些部分和在Clojure(逻辑)的一些部分。 在逻辑中,这实际上是有道理的,你将能够使用macros为你的逻辑构build一种语言,我认为有比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网站的互操作性部分。

没有人提出,所以我会:浏览器作为UI平台。 你可以在Clojure中编写应用程序,包括一个HTTP服务器,然后使用HTML, 打嗝 ,ClojureScript和任何你需要的数十亿JS库中的任何一个开发UI。 如果你想要一致的浏览器行为和“桌面应用程序look'n'feel”,你可以捆绑铬与你的应用程序 。

这似乎是Light Table分发的方式。

在clojure contrib中有一个MigLayout的包装器。 你也可以看看http://gist.github.com/261140 。 基本上,我正在写任何代码,因为我正在学习swing / miglayout。

使用contrib.swing-utils以lispy方式重新编写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))) 

邮件列表上有几个关于Cell(la Kenny Tilton's Cells )实现的讨论。 这是一个非常干净的GUI编程方式。

我宁愿去clojurefx,这是有点不成熟,但它确实工作,节省您的时间。

我用跷跷板开始我的GUI,然后在clojurefx尝试另一个组件。

我已经完成了两个,我相信我要重构clojurefx跷跷板之一。

毕竟,JavaFX是前进的道路。

感觉比跷跷板轻。 或者至less,写它..

绑定工作,侦听器工作,大部分的组件工作,否则,只需使用其中一个macros来创build一个特定的案例和工作完成的构造函数。 或者,如果你觉得困难,用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中编写一个graphics用户界面,并提出了这个图书馆:

https://github.com/jonasseglare/signe

它可以让你使用代表你的领域模型作为一个单一的包装在primefaces中的Clojure数据结构。

看到这里的例子: https : //github.com/jonasseglare/signe/blob/master/src/signe/examples.clj

我一直在开发一个Java小应用程序,其中一切都用Clojure编写,除了用Java编写的小程序代码。 applet调用Clojure代码从java钩子调用init,paint等的applet模型定义的方法。 所以代码最终成为了99.999%的Clojure,而且你根本不必考虑这个小小的Java代码。

这种方法有一些缺点,我希望能够更详细地讨论Clojure Google Group。 我认为Clojure开发人员应该包括一个本地的应用程序构build方式。 目前,您可以从REPL中执行任何您喜欢的GUIfunction,但是如果您想要一个可交付的GUI应用程序,则需要编写一些Java来调用Clojure代码。 而且,Java Applet的架构看起来像是强迫你在Clojure的更惯用的最佳实践之外,要求你使用可变状态等等。

但是,我还没有和Clojure做的很远,可能是这样的情况,我可能还没有发现如何正确地做到这一点。

Clojure和SWT是做GUI的最好方法。 从本质上讲,SWT是一种用于开发软件的即插即用式的方法。

我不认为有一个正式的,但我个人会利用这个事实,即我正在使用世界上最强大的语言之一,想象一下完美的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})]) 

你的想法会有所不同,但这应该有希望上面给你一些想法。

我知道你是暗示古典桌面解决scheme,但networking适合clojure很好。 我已经编写了一个完整的audio应用程序,所有的东西都被连接起来,所以如果你添加音乐到audio文件夹,它会反映在Web UI中。 只是说,桌面应用程序不是唯一的方法:)

我的首选Clojure UI环境使用IO.js(节点为ES6) + 电子(容器) + 静态(ReactJS包装) 。

所以我没有在Timothy Baldridge(halgiri)这个名单上看到Fn-Fx。 这是一个提供JavaFXfunction抽象的Clojure库。

它可以在https://github.com/halgari/fn-fx的; Github上find。

要使用,请确保您正在使用最新版本的Java(1.8 90+),并通过将以下内容添加到您的project.clj中,将依赖项添加到github repo:

:plugins [[lein-git-deps "0.0.1-SNAPSHOT"]] :git-dependencies [["https://github.com/halgari/fn-fx.git"]]

我已经尝试过了,而且它是开箱即用的。