适用于Scala的GUI框架?

Jes*_*ose 69 java user-interface scala

适当的,我的意思是:

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

没有特别的顺序.

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

rol*_*lve 36

Scala有自己的Swing库.这将使用引擎盖下的标准Swing库,但它有一些很好的补充,最值得注意的是,因为它是为Scala制作的,所以它可以比标准的Swing库更简洁的方式使用:

import swing._

object HelloWorld extends SimpleSwingApplication {
  def top = new MainFrame {
    title = "Hello, World!"
    contents = new Button {
      text = "Click Me!"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

看看设置小部件属性有多好和容易?

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

是Scala Swing概述.


evi*_*bag 22

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

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

  • 属性绑定 - 这是我的杀手级功能.说我有三个要素:A,B,和C.A并且B可以调整大小,并且C应该有一个高度是高度的总和A,并B在任何时候.在Swing中,这将涉及编写一组自定义事件侦听器来执行此工作.ScalaFX绑定允许您通过使用属性bind运算符来表达这一点:C.height <== A.height + B.height.除了其他功能之外,这还具有非常Scala-idiomatic的感觉.

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

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


Owe*_*wen 16

我使用Java Swing.以下是它与您的要求相符的方式:

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

  • 丰富的小部件设置和渲染:这是有争议的.当您考虑使用其他库(例如SwingX)轻松补充Java Swing的能力时,它至少在这方面比Scala Swing更好,尽管可能不如其他一些Java工具包(尽管我不能对它们说话) .

  • 惯用的斯卡拉:没有你想象的那么糟糕.一些辅助函数使它更好:

    implicit class And[A](a: A) {
      def and(f: A => Unit): A = {
        f(a); a
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    这样你就可以做到

    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)))
    
    Run Code Online (Sandbox Code Playgroud)

    至于事件和状态,在我看来,这仍然是所有 gui框架中的粗略边缘- 听众有他们的问题,事件流有他们的问题.我在使用反应核心重做信号(我自己的,未记录的)增强Swing事件方面取得了一般成功,以便更容易组织状态.

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

      def actionListener(f: => Unit) = new ActionListener {
        def actionPerformed(e: ActionEvent) { f }
      }
    
    Run Code Online (Sandbox Code Playgroud)

      def later(thing: => Unit) {
        SwingUtilities.invokeLater(new Runnable {
          def run() {
            thing
          }
        })
      }
    
    Run Code Online (Sandbox Code Playgroud)

    就个人而言,我希望Scala Swing采取这种方式.为现有Java类编写包装器是O(n)程序员时间,并没有为作者没有选择编写包装器的类提供任何帮助.创建通用的语法糖会让你更快.

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

  • 独立API文档:是的.


Owe*_*wen 5

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

违背您的要求:

  • 成熟和广泛使用 - HTML/CSS/JS,ScalaJS不是(但考虑到它是出乎意料的好).因此,您可能遇到ScalaJS特定的挂起,但底层技术非常强大.
  • 丰富的小部件设置,呈现良好 - 是的.
  • 惯用的Scala - 不:你最终会使用大量的jquery,它们大多是动态类型的.ScalaTags在改善它方面做了很多工作.
  • 有一个WYSIWYG-ish但灵活的GUI构建器 - 是的,很多.
  • 独立的API文档(如果是包装器,它不应该让我用另一种语言引用父项目) - 是的.

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

  • 如果你选择朝着这个方向前进(你应该这样,scala.js是*真棒*!),这里有一个非常好的教程:http://lihaoyi.github.io/hands-on-scala-js/.lihaoyi的图书馆也是坚如磐石的 - scalatags,autowire,upickle,utest - 你应该检查它们. (2认同)

Luk*_*asz -25

我想说使用.Net,它成熟且使用广泛。

但 ...

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