适合Scala的GUI框架?

我的意思是:

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

没有特别的顺序。

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

斯卡拉有它自己的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概述 。

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

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

  • 属性绑定 – 这是我的杀手级function。 说我有三个元素: ABC AB是可resize的,并且C应该具有AB高度总和的高度。 在Swing中,这将涉及编写一组自定义事件侦听器来执行此项工作。 ScalaFX绑定可以让你简单地通过使用属性绑定运算符来expression: C.height <== A.height + B.height 。 除此之外,这也是一种非常Scala-idiomatic的感觉。

  • JavaFX的场景生成器(写入testing版)​​是一个所见即所得的GUI编辑器(虽然我没有尝试过)。

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

我使用Java Swing。 以下是它如何与您的要求叠加起来:

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

  • 丰富的小部件集和呈现:这是有争议的。 当你考虑使用额外的库(例如SwingX)轻松地补充Java Swing的能力时,在这方面它至less比Scala Swing更好,但可能不如其他一些Java工具包(虽然我不能说那些) 。

  • 习惯斯卡拉:不像你想象的那样糟糕。 一些帮助函数使它更好:

     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框架中的一个粗糙的边缘 – 听众有他们的问题,事件stream有他们的问题。 为了使组织状态变得更容易,我用反应核心和重做信号 (我自己的,没有logging的)加强了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)程序员的时间,对于作者没有select编写包装的类没有任何帮助。 创build通用语法糖会让你更快得多。

  • 有一个所见即所得的,但灵活的GUI生成器:我使用IntelliJ IDEAforms,使抽象类,然后用Scala类子类。 组织成本只有一个额外的文件,我没有写Java代码。

  • 独立的API文档:是的。

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

违反你的要求:

  • 成熟和广泛使用 – HTML / CSS / JS是,ScalaJS不(但它是出人意料的好考虑)。 所以,你可能遇到ScalaJS特定的挂断,但底层技术是非常强大的。
  • 丰富的小部件集呈现良好 – 是的。
  • 惯用的斯卡拉 – 不,你最终会使用大量的jquery,这将主要是dynamictypes。 ScalaTags做了很多努力,虽然做得更好。
  • 有一个所见即所得,但灵活的GUI生成器 – 是的,很多。
  • 独立的API文档(如果是封装,它不应该让我用另一种语言来引用父项目) – 是的。

缺点是它将GUI从JVM切换到浏览器,因此不能使用所有这些Java库。

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

但是…

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