在Clojure中进行GUI的最佳方法是什么?
有一些功能性Swing或SWT包装器的例子吗?或者与JavaFX声明性GUI描述的某些集成,可以使用一些宏观程序轻松地包装到s表达式?
任何教程?
我会谦卑地建议跷跷板.
这是一个基于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 "Hello from Clojure. 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编程,我会指向温度转换器或蚂蚁殖民地.
Swing中的许多内容都是通过子类化完成的,特别是在创建自定义组件时.为此,有两个基本功能/宏:代理和gen-class.
现在,我了解更多Lispy方式.我认为还没有那样的东西.我强烈建议不要尝试构建一个宏大的GUI构建框架a-la CLIM,而是做更多的Lispy:开始编写Swing应用程序并用宏来抽象出你的常见模式.在这样做时,您最终可能会使用一种语言来编写您的GUI,或者可能是一些可以共享和增长的非常通用的东西.
在Clojure中编写GUI时丢失的一件事是使用像Matisse这样的工具.这可以强烈指向在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 "Hello from Clojure. 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",您可以将chrome与您的应用程序捆绑在一起.
这似乎是Light Table的分布方式.
在clojure contrib中有一个MigLayout的包装器.你也可以看看http://gist.github.com/261140.因为我正在学习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 "Hello from Clojure. 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)))
有许多人在邮件列表上的谈话大约几格(一拉肯尼蒂尔顿的细胞)的实现.这是一种非常巧妙的GUI编程方式.
我宁愿选择clojurefx,它有点过早,但它确实有效并节省您的时间.
我用跷跷板开始我的GUI,然后在clojurefx中尝试了另一个组件.
我已经完成了两个,我相信我要将跷跷板重构为clojurefx.
毕竟,JavaFX是前进的方式.
它感觉比跷跷板轻.或者至少,写它..
绑定工作,监听器工作,大多数组件工作,否则,只需使用其中一个宏为特定案例和工作完成创建构造函数.或者,如果您觉得困难,请在Java中编写一些方法并寻求帮助以改进clojurefx.
编写clojurefx的人现在很忙,但你可以分叉项目并做一些修复.