【问题标题】:Should I use Java for a custom Swing component designed for a clojure app?我应该将 Java 用于为 clojure 应用程序设计的自定义 Swing 组件吗?
【发布时间】:2012-03-23 11:27:03
【问题描述】:

我想要一个用于 clojure/seesaw 应用程序的简单时间线组件(如在视频编辑软件中),我想知道直接用 clojure 和 seesaw 实现它是否是一种好方法,或者我是否应该用 java 编写它并制作我的clojure包装器。

或更笼统地说:函数式编程语言是否最适合编写 UI 小部件?我无法想象在没有涉及很多状态的情况下这样做。 OO 最初不是为 UI 开发而发明的吗?

【问题讨论】:

    标签: swing clojure seesaw


    【解决方案1】:

    你可以选择任何一种方式。在 Overtone 上,我们使用 Seesaw 构建了许多自定义图形组件directly in Clojure。很多时候,一个原子和(seesaw.core/canvas) 就足够了。

    根据您的喜好,在 Clojure 中执行此操作的一个原因是您可以将 Seesaw 的协议(选择、绑定等)扩展到新的小部件,以便它与 Seesaw 无缝协作。另一个考虑因素是您的小部件是否需要使用来自应用程序其他部分的 Clojure 数据。这在 Clojure 中将比 Java 更简洁。

    也就是说,如果您对 Swing/Java 感到满意,您可以在那里进行,Seesaw 将非常乐意使用 Java 构建的自定义小部件。祝你好运!

    【讨论】:

    • 使用原子和画布实际上是我的第一种方法,但是当交互变得更加复杂时,我开始弄得一团糟。很高兴听到泛音,并且在跷跷板上确实有自定义摆动组件的示例。
    【解决方案2】:

    FP 非常适合进行 UI 编程,但底层 UI 框架也应该基于 FRP 等 FP 概念。在您的情况下,底层 UI 框架(Swing)是基于 OO 的,因此它更容易实现它在 Java 中,但您仍然可以在跷跷板中完成。

    【讨论】:

    • 谢谢。我将在这里采用java方式。但 FRP 是一个有趣的点。以前没听说过。我必须调查一下。
    • 有状态本身并不是不使用 Clojure 的理由。我发现即使是纯互操作的 Clojure 代码,用 Clojure 编写 Java 也比用 Java 更容易。
    【解决方案3】:

    在其他条件相同的情况下(即假设您同时了解 Clojure 和 Java),我可能会将其编写为 Java 中的自定义 Swing 组件。

    原因:

    • Swing 本质上是一个基于 Java 的 OOP 框架,在范式方面更适合 Java
    • Java 中的可变状态比 Clojure 中的更容易
    • 如果您用 Java 编写它,您可以更轻松地在其他地方使用它(例如,作为其他 Java 代码的库)
    • 创建 Swing 组件后,在 Clojure 中封装它很容易

    当然,对于应用程序逻辑本身,我当然更喜欢 Clojure。

    【讨论】:

    • 感谢您的澄清。我倾向于使用 java 来解决我的问题。但也许更多是因为我是 clojure 新手,并且在 java 中感觉更舒服。
    • 这个答案并不完全正确。 Java 对象的可变状态在 Clojure 中与在 Java 中一样简单。
    • @rplvy - 当然你可以使用(set! (. objectExpr fieldName) expr),但即便如此,它还是不如objectExpr.fieldName=expr 方便(尤其是当你考虑缺少静态类型检查并且需要类型提示来避免反射等时)。除此之外,您根本不能使用在 OOP GUI 代码中非常有用的可变局部变量。虽然我很喜欢 Clojure,但它对于管理本地单线程可变状态并不是最方便的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多