在 Clojure中做 GUI 的最好方法是什么?
有功能性 摇摆或 SWT包装器的例子吗? 或者与 JavaFX声明性 GUI 描述的某种集成,这种集成可以使用某种宏观技术轻松地封装到 S 表达式中?
有什么教程吗?
来自 呼叫:
(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 网站的 互操作性部分。
如果你想做 GUI 编程,我会指向 温度转换器或 蚁群。
Swing 中的许多事情都是通过子类来完成的,特别是在创建自定义组件时。为此,有两个必不可少的函数/宏: 代理人和 世代级的。
现在我明白你为什么要用 Lispy 的方式了。我觉得现在还没有这样的东西。我强烈建议不要尝试构建一个宏大的 GUI 构建框架(如 CLIM) ,而是要做一些更 Lispy 的事情: 开始编写 Swing 应用程序,并用宏抽象出常见的模式。当你这样做的时候,你可能最终会用一种语言来编写你的 GUI,或者一些可以共享和增长的非常普通的东西。
在 Clojure 编写图形用户界面时,你会失去一样东西,那就是使用马蒂斯(Matisse)这样的工具。这可能是用 Java (GUI)和 Clojure (逻辑)编写部分代码的强指针。这实际上是有意义的,因为在逻辑中,您将能够使用宏为您的类型的逻辑构建一种语言,我认为这比使用 GUI 有更多的好处。显然,这取决于您的应用程序。
Clojure 和 SWT 是实现 GUI 的最佳方法。本质上,SWT 是一种即插即用的软件开发方法。
我一直在开发一个 Javaapplet,其中除了用 Java 编写的 applet 代码之外,所有内容都是用 Clojure 编写的。Applet 调用 Clojure 代码从 java 钩子中的 init、 Paintetc 回调那些由 applet 模型定义的方法。所以代码最终是99.999% 的 Clojure 大部分情况下你根本不需要考虑 Java 的小部分。
这种方法有一些缺点,我希望在 Clojure Google Group 上更详细地讨论这些缺点。我认为 Clojure 开发人员应该包括一种构建应用程序的本地方式。目前,您可以在 REPL 中做任何您想做的 GUI 事情,但是如果您想要一个可交付的 GUI 应用程序,那么有必要编写一些 Java 来调用 Clojure 代码。而且,Java Applet 的架构似乎迫使您脱离 Clojure 更惯用的最佳实践,要求您使用可变状态等等。
但是,我对 Clojure 的研究还不是很深入,它可能是有可能的,只是我还没有发现如何正确地完成它。
有关于一些 Cell (如 Kenny Tilton 的牢房)实现的 在邮件列表上交谈。这是一种非常简洁的 GUI 编程方式。
下面是另一个非常基本的秋千包装例子:
; 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)))
我不认为有一个正式的,但个人而言,我会利用这个事实,我正在使用世界上最强大的语言之一,只是想象一下完美的 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 Contrib 中有一个用于 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)))
我知道你是在暗示传统的桌面解决方案,但是 web 非常适合 clojure。我已经写了一个完整的音频应用程序,其中一切都挂起来,以便如果你添加音乐到音频文件夹,它是反映在网络用户界面。只是说桌面应用程序不是唯一的方法:)
Stuart Sierra 最近发表了一系列关于用 clojure (和 swing)开发 GUI 的博客文章
我将谦卑地建议 跷跷板。
下面是一个基于 REPL 的教程 ,它假设没有 Java 或 Swing 知识。
跷跷板很像@tomjen 建议的那样。以下是“ Hello,World”:
(use 'seesaw.core) (-> (frame :title "Hello" :content "Hello, Seesaw" :on-close :exit) pack! show!)
下面是“ Abhiith”和“ 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!)
还没有人建议这样做,所以我将: 浏览器作为 UI 平台。你可以在 Clojure 编写应用程序,包括一个 HTTP 服务器,然后使用从 HTML 到 小嗝嗝、 ClojureScript 和任何你需要的数十亿的 JS 库来开发 UI。如果你想要一致的浏览器行为和“桌面应用程序外观”,你可以 把 chrome 和你的应用捆绑在一起。
这似乎就是 灯台的分布方式。
我宁愿选择 clojurefx,这有点早,但它确实有效,节省了你的时间。
我用跷跷板开始我的 GUI,然后在 clojurefx 中尝试另一个组件。
我已经完成了这两个,我确信,我要重构跷跷板一到 cljurefx。
毕竟,JavaFX 是前进的方向。
感觉比跷跷板轻,或者至少写出来。
绑定可以工作,侦听器可以工作,大多数组件都可以工作,否则,只需要使用其中一个宏来为特定的用例和任务创建一个构造函数。或者,如果您觉得很困难,可以用 Java 编写一些方法,并请求帮助来改进 clojurefx。
写 clojurefx 的家伙现在很忙,但是你可以分叉项目并做一些修复。
我问自己同样的问题,用 Swing 在 Clojure 编写一个图形用户界面,然后得到了一个类库 签名
它允许您使用将域模型表示为包装在原子中的单个 Clojure 数据结构。
参见示例 给你。
我首选的 Clojure UI 环境使用 IO.js (ES6节点) + 电子(集装箱) + 静止(ReactJS 包装器)。
因此,我没有看到 Fn-Fx 在这个名单上,从蒂莫西鲍德里奇(Halgiri)。这是一个通过 JavaFX 提供函数抽象的 Clojure 库。
它可以在 https://github.com/halgari/fn-fx的 Github 上找到。
要使用,请确保您使用的是 Java 的最新版本(1.890 +) ,并通过向 project.clj 添加以下内容来向 github repo 添加一个依赖项:
:plugins [[lein-git-deps "0.0.1-SNAPSHOT"]] :git-dependencies [["https://github.com/halgari/fn-fx.git"]]
我已经试过了,而且效果很好。
Cljfx 被描述为
JavaFX 的声明性、功能性和可扩展性包装受到了更好的反应和重构部分的启发
以及 JavaFx为
一个开源的下一代客户端应用平台,用于基于 Java 的桌面、移动和嵌入式系统。它是许多个人和公司的协作努力,目标是为开发富客户端应用程序提供一个现代、高效和功能齐全的工具包。
它的创建者使用它来构建 揭示和 黑客新闻演示,后者具有各种功能,并通过 Jpackage对多个操作系统进行一些捆绑。
通过利用 JavaFX 为桌面、移动和 web 构建 UI,您可以获得 Clojure REPL 驱动的开发。