代码之家  ›  专栏  ›  技术社区  ›  Marko

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

  •  143
  • Marko  · 技术社区  · 16 年前

    做吉他最好的方法是什么 Clojure ?

    有什么实用的例子吗 Swing SWT 包装纸? 或者与 JavaFX 可轻松包装到的声明性GUI描述 s-expressions 用宏观的方法?

    有什么教程吗?

    16 回复  |  直到 7 年前
        1
  •  116
  •   Sean Allred    9 年前

    我谦虚地建议 Seesaw .

    Here's a REPL-based tutorial 假定没有Java或Swing知识。


    Seesaw和@Tomjen的建议非常相似。这是“你好,世界”:

    (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
  •  32
  •   steglig    14 年前

    Stuart Sierra最近发表了一系列关于与Clojure(和Swing)开发GUI的博客文章。从这里开始: http://stuartsierra.com/2010/01/02/first-steps-with-clojure-swing

        3
  •  16
  •   Carl Smotricz    15 年前

    如果你想做图形用户界面编程,我会指 Temperature Converter the ants colony .

    Swing中的许多工作都是通过子类完成的,特别是在创建自定义组件时。为此,有两个基本功能/宏: proxy gen-class .

    现在我明白了,你要用更轻率的方式去哪里。我想现在还没有这样的东西。我强烈建议不要尝试构建一个宏伟的GUI构建框架A-LA。 CLIM 但是要做一些更简单的事情:开始编写Swing应用程序并用宏抽象出常见的模式。当你这样做的时候,你可能最终会得到一种语言来编写你的gui,或者一些非常通用的东西,它们可以被共享和增长。

    在Clojure中编写guis时,有一件事是使用matisse之类的工具。这可以很好地指向Java(GUI)中的某些部分和Culjule(逻辑)中的某些部分。这实际上是有意义的,因为在逻辑中,你可以使用宏为你的逻辑类型构建一种语言,我认为这比使用图形用户界面有更多的好处。显然,这取决于您的应用程序。

        4
  •  14
  •   dsm    15 年前

    由此 page :

    (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");
    

    当然,值得一看 interoperability Clojure网站的一部分。

        5
  •  13
  •   Matthew Gilliard    11 年前

    现在还没有人建议,所以我会:浏览器作为用户界面平台。您可以在Clojure中编写应用程序,包括一个HTTP服务器,然后使用从HTML到 hiccup ,clojurescript和您需要的数十亿JS libaries中的任何一个。如果你想要一致的浏览器行为和“桌面应用程序外观”你可以 bundle chrome with your app .

    这似乎是 Light Table 是分布式的。

        6
  •  8
  •   Abhijith    15 年前

    Clojure Contrib中有一个miglayout包装器。你也可以看看 http://gist.github.com/261140 . 在学习Swing/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)))
    
        7
  •  6
  •   Joe W.    15 年前

    已经有 talk on the mailing list 关于几个细胞(a la Kenny Tilton's Cells )实施。这是一种非常好的GUI编程方法。

        8
  •  5
  •   Efrain Bergillos    10 年前

    我宁愿选择Clojurefx,这有点过早,但它确实有效,而且节省了你的时间。

    我用Seesaw启动了我的GUI,然后在Clojurefx中尝试了另一个组件。

    我已经完成了这两项工作,我确信我将把跷跷板重构为Clojurefx。

    毕竟,JavaFX是前进的道路。

    感觉比跷跷板轻。或者至少,写下它……

    绑定工作,侦听器工作,大部分组件工作,否则,只需使用其中一个宏为特定情况和完成的工作创建一个构造函数。或者,如果你发现它很难,写一些方法在Java和寻求帮助,以改善Culjulfx。

    写Clojurefx的人现在很忙,但是你可以分出这个项目来做一些修改。

        9
  •  4
  •   Jeroen Dirks    15 年前

    这是另一个非常基本的回转包装示例。

    ; 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)))
    
        10
  •  3
  •   Rulle    10 年前

    我问自己同样的问题:用Swing在Clojure中编写一个GUI,然后想到了这个库:

    https://github.com/jonasseglare/signe

    它允许您将域模型表示为一个封装在原子中的Clojure数据结构。

    请参见以下示例: https://github.com/jonasseglare/signe/blob/master/src/signe/examples.clj

        11
  •  2
  •   Robert Levy    15 年前

    我一直在开发一个Java小程序,其中除了用Java编写的Applet代码之外,所有的东西都是用CuljJuy编写的。Applet从Java的钩子中调用Cujjule代码的init、油漆等的回调,用于由applet模型定义的那些方法。因此,代码最终是99.999%的Culjure,并且你不必在大多数情况下考虑这个极小的Java块。

    这种方法有一些缺点,我希望在Clojure Google Group上更详细地讨论。我认为Clojure开发人员应该包括构建应用程序的本地方法。目前,你可以从RePL中做任何你喜欢的GUI,但是如果你想要一个可交付的GUI应用程序,就需要编写一些Java来调用CuljuleCu码。而且,Java应用程序的体系结构似乎迫使你在Culjure的更习惯的最佳实践之外,需要使用可变的状态等等。

    而且,我和Clojure的关系还不太好,可能是因为这是有可能的,我只是还没有找到正确的方法。

        12
  •  2
  •   Bill Barnhill    7 年前

    所以我没有在这份名单上看到来自蒂莫西·鲍德里奇(Halgiri)的FN外汇。这是一个Clojure库,在JavaFX上提供了一个功能抽象。

    可以在Github上找到 https://github.com/halgari/fn-fx .

    要使用,请确保您使用的是Java(1.8 90 +)的最新版本,并向Github RePo添加一个依赖项,将以下内容添加到您的项目中:

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

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

        13
  •  1
  •   Berlin Brown    15 年前

    Clojure和SWT是执行GUI的最佳方法。本质上,SWT是一种即插即用的软件开发方法。

        14
  •  1
  •   tomjen    15 年前

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

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

        15
  •  1
  •   Anders Rune Jensen    15 年前

    我知道你在暗示经典的桌面解决方案,但是网络很适合Clojure。我已经写了一个完整的音频应用程序,所有的东西都连接在一起,这样如果你把音乐添加到音频文件夹中,它就会反映在网络用户界面中。只是说桌面应用程序不是唯一的方法:)

        16
  •  1
  •   T.W.R. Cole    9 年前