适用于Scala的GUI框架?

时间:2012-05-08 10:47:07

标签: java scala user-interface

合适的,我的意思是:

  • 成熟并广泛使用
  • 呈现良好的丰富小部件集
  • 惯用的Scala
  • 有一个WYSIWYG-ish但灵活的GUI构建器
  • 独立的API文档(如果是包装器,它不应该让我用其他语言引用父项目)

没有特别的顺序。

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

5 个答案:

答案 0 :(得分:35)

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几乎相同。

这是一个Overview of Scala Swing

答案 1 :(得分:21)

ScalaFX是JavaFX 2的成熟包装器。它在某些方面表面上与Scala Swing类似,但它具有一些让它脱颖而出的功能:

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

  • 属性绑定 - 这是我的杀手级功能。假设我有三个要素:ABCAB可调整大小,C的高度应始终为AB的高度之和。在Swing中,这将涉及编写一组自定义事件侦听器来执行此工作。 ScalaFX绑定允许您通过使用属性绑定运算符C.height <== A.height + B.height来简单地表达它。除了其他功能之外,这还具有非常Scala-idiomatic的感觉。

  • JavaFX场景生成器(在编写时为测试版)是一个WYSIWYG GUI编辑器(虽然我还没试过)。

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

答案 2 :(得分:16)

我使用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框架的粗略优势 - 听众有他们的问题,事件流有他们的问题。我在使用reactive-coreredo-signals(我自己的,未记录的)扩充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)程序员时间,并没有为作者没有选择编写包装器的类提供任何帮助。创建通用的语法糖将使你更快。

  • 有一个WYSIWYG-ish但灵活的GUI构建器:我使用IntelliJ IDEA表单,创建一个抽象类,然后使用Scala类将其子类化。组织成本只是一个额外的文件,我没有编写任何Java代码。

  • 独立API文档:是。

答案 3 :(得分:5)

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

违背您的要求:

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

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

答案 4 :(得分:-19)

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

但是......

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