适合 Scala 的 GUI 框架?

合适的意思是:

  • 成熟并广泛使用
  • 呈现良好的丰富小部件集
  • 习惯用法 Scala
  • 有一个所见即所得但灵活的 GUI 构建器
  • 独立的 API 文档(如果是包装器,它不会让我用另一种语言引用父项目)

没有特别的顺序。

哪个 GUI 工具包满足哪些条件?

40672 次浏览

我会说使用。网络它的成熟和广泛使用。

但是..。

我假设您需要使用 Scala。为此,我坚持使用 Java,因为它有更好的工具支持,比如 IDEA 或 NetBeans。你当然可以混合 Java 和 Scala。因此,您的 GUI 可以在调用 Scala 后端的 Java 中完成。也可以看看 JGoodies,他们有很多不错的东西来构建 Swing 的 UI。目前还没有对 Scala GUI 应用程序的工具支持(对于非 GUI,它仍然落后于 Java)。

Scala 有自己的 Swing 库。这将使用标准的 Swing 库,但它有一些很好的补充,最值得注意的是,因为它是为 Scala 设计的,它可以用一种比标准的 Swing 库更简洁的方式来使用:

import swing._


object HelloWorld extends SimpleSwingApplication {
def top = new MainFrame {
title = "Hello, World!"
contents = new Button {
text = "Click Me!"
}
}
}

看到设置小部件属性是多么简单和容易了吗?

除了更好的语法和小的添加(如 SimpleSwingApplication类) ,我认为其优缺点与普通的 Swing 几乎相同。

这是 Scala Swing 概述

我使用 Java Swing,下面是它如何满足您的需求:

  • 成熟并广泛使用: 是的,一吨。

  • 丰富的小部件集和渲染效果良好: 这是有争议的。当你考虑到用额外的库(比如 SwingX)轻松地补充 Java Swing 的能力时,它至少在这方面比 Scala Swing 做得更好,尽管可能不如其他一些 Java 工具包(尽管我不能说这些)。

  • 习惯用法 Scala: 没有你想象的那么糟糕,一些助手函数可以让它变得更好:

    implicit class And[A](a: A) {
    def and(f: A => Unit): A = {
    f(a); a
    }
    }
    

    这样你就可以

    val button = (new JButton("Press me!")
    and (_ setForeground Color.red)
    and (_ setFont new Font(null, Font.PLAIN, 12)))
    
    
    val win = (new JFrame("Hello!")
    and (_ add button)
    and (_ pack())
    and (_ setDefaultCloseOperation JFrame.EXIT_ON_CLOSE)
    and (_ setVisible(true)))
    

    至于事件和状态,在我看来,这仍然是 所有 gui 框架中的一个粗糙边缘——侦听器有它们的问题,事件流也有它们的问题。我已经在使用 反应堆重做信号(我自己的,没有文档记录的)增加 Swing 事件方面取得了一般性的成功,以便更容易地组织状态。

    您可以使用更多的助手函数来改进定义侦听器的详细程度,如

      def actionListener(f: => Unit) = new ActionListener {
    def actionPerformed(e: ActionEvent) { f }
    }
    

    还有

      def later(thing: => Unit) {
    SwingUtilities.invokeLater(new Runnable {
    def run() {
    thing
    }
    })
    }
    

    个人而言,我希望 Scala Swing 采取了这种方式。为现有 Java 类编写包装器是 O (n)程序员的时间,并且不会为作者没有选择为其编写包装器的类提供任何东西。创建通用语法 Sugar 将使您更快地完成更多工作。

  • 得到了一个所见即所得但灵活的 GUI 构建器: 我使用 IntelliJ IDEA 表单来创建一个抽象类,然后用 Scala 类对它进行子类化。组织成本只有1个额外的文件,而且我没有编写 Java 代码。

  • 独立 API 文档: 是的。

ScalaFX 是围绕 JavaFX2的一个成熟的包装器。从表面上看,它与 Scala Swing 在某些方面很相似,但它有一些突出的特性:

  • 与本地图形库的耦合——这意味着可以访问硬件加速和其他好东西,但是需要在系统上安装 JavaFX 运行时。它包含在 Java8的大多数主要发行版中。这也意味着它在与之兼容的系统上呈现得非常好。

  • 属性绑定-这是我的杀手级功能。假设我有三个元素: ABCAB是可调整的,而 C应该有一个高度,即 AB在任何时候的高度之和。在 Swing 中,这将涉及编写一组自定义事件侦听器来执行这项工作。ScalaFX 绑定允许您使用属性绑定操作符 C.height <== A.height + B.height简单地表达这一点。除了其他特性之外,这使得 Scala 给人一种非常惯用的感觉。

  • JavaFXSceneBuilder (目前还处于测试阶段)是一个所见即所得的 GUI 编辑器(不过我还没有试过)。

  • 文档是它的弱点,作为一个包装器,它经常引用 JavaFX 文档。

现在已经过去了一段时间,值得注意的是,ScalaJS 也是一个可以考虑的选项。

违反你的要求:

  • 成熟并被广泛使用—— HTML/CSS/JS 是,ScalaJS 不是(但考虑到这一点,它出人意料地好)。因此,您可能会遇到特定于 ScalaJS 的 hangups,但是底层技术是非常健壮的。
  • 丰富的小部件集,可以很好地呈现——是的。
  • 惯用的 Scala ——不: 您最终将使用大量的 jquery,它们大多是动态类型化的。尽管 ScalaTags在使它变得更好方面做了很多工作。
  • 有一个所见即所得但灵活的 GUI 构建器——是的,很多。
  • 独立的 API 文档(如果是包装器,它不会让我用另一种语言引用父项目)——是的。

缺点是它将您的 GUI 从 JVM 转移到浏览器中,因此您无法使用所有这些 Java 库。