72

合适,我的意思是:

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

没有特别的顺序。

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

4

5 回答 5

38

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类),我认为优点和缺点与 vanilla Swing 几乎相同。

这是Scala Swing 的概述

于 2012-05-08T13:13:39.757 回答
24

ScalaFX 是围绕 JavaFX 2 的成熟包装器。它在某些方面与 Scala Swing 表面上相似,但有一些使其脱颖而出的特性:

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

  • 属性绑定 - 这是我的杀手锏。假设我有三个元素:ABCA并且B是可调整大小的,并且C应该具有一个高度,它是所有时间的高度之AB。在 Swing 中,这将涉及编写一组自定义事件侦听器来执行这项工作。ScalaFX 绑定让您可以通过使用属性绑定运算符简单地表达这一点:C.height <== A.height + B.height。除了其他特性之外,这也带来了一种非常 Scala 惯用的感觉。

  • JavaFX Scene Builder(在撰写本文时处于测试阶段)是一个所见即所得的 GUI 编辑器(不过我还没有尝试过)。

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

于 2014-06-13T22:02:37.570 回答
17

我使用 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) 程序员的时间,并且对于作者没有选择为其编写包装器的类不会得到任何东西。创建通用语法糖会让你走得更快。

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

  • 独立 API 文档:是的。

于 2013-10-22T23:38:28.837 回答
6

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

根据您的要求:

  • 成熟并被广泛使用——HTML/CSS/JS 是,ScalaJS 不是(但考虑到它非常好)。因此,您可能会遇到特定于 ScalaJS 的挂断,但底层技术非常强大。
  • 渲染良好的丰富小部件集——是的。
  • 惯用的 Scala——不:你最终会使用很多 jquery,它们大多是动态类型的。ScalaTags在使它变得更好方面做了很多工作。
  • 有一个所见即所得但灵活的 GUI 构建器——是的,很多。
  • 独立的 API 文档(如果是包装器,它不应该让我用另一种语言引用父项目)——是的。

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

于 2015-06-28T20:36:23.283 回答
-23

我会说使用.Net 成熟并广泛使用。

但 ...

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

于 2012-05-08T13:08:56.247 回答