适用于Scala的GUI框架?


71

我的意思是:

  • 成熟并广泛使用
  • 丰富的小部件集,呈现效果很好
  • 惯用的Scala
  • 获得了所见即所得但灵活的GUI构建器
  • 独立的API文档(如果是包装器,则不应使我用另一种语言引用父项目)

没有特别的顺序。

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


1
不看基于Java的框架没有帮助。有Scala Swing,它部分包裹了Swing,并随Scala一起提供。可能有较小的项目试图围绕JavaFX 2.0或SWT之类的东西构建Scala包装器。我认为其他(甚至)Java框架也无法满足您的要求。
ziggystar,2012年

我认为不存在用于Scala的GUI构建器。您可以将NetBeans等生成的Java代码剪切并粘贴到IntelliJ中,以自动转换为Scala,但是如果您随后想要更改布局,则很痛苦,并且您将只使用Java Swing,因此它不是惯用的,但是不幸的是,目前没有其他选择。
路易吉·普林格

1
我要向您建议的是我现在对GUI所做的事情。用HTML(5)和JavaScript(AngularJS很好)开发GUI,然后可以在应用程序中开发一个非常小的服务器,以为GUI公开一些类似REST的服务。您可以在系统的默认浏览器中打开应用程序页面(localhost:your-server-port),也可以在JFrame中嵌入浏览器组件。该解决方案背后的理由是HTML是地球上最独立于平台且最丰富的GUI库。甚至Oracle正式表示,Swing的维护时间不会很长。
ehsun7b 2015年

Answers:


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

是Scala Swing概述


那看起来不像是缩进吗?有什么避免回旋镖效应的方法吗?
Chetan Bhasin 2014年

22

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

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

  • 属性绑定-这是我的杀手feature。说我有三个要素:AB,和CA并且B是可调整大小的,并且C应该具有始终为和的高度之A和的高度B。在Swing中,这将涉及编写一组自定义事件侦听器以执行此工作。ScalaFX绑定使您可以通过使用属性bind操作符来简单地表达这一点C.height <== A.height + B.height。除其他功能外,这还具有Scala惯用的感觉。

  • JavaFX Scene Builder(在撰写本文时为Beta版)是一种WYSIWYG GUI编辑器(不过,我还没有尝试过)。

  • 文档是它的弱点。作为包装器,它经常回头参考JavaFX文档。


17

我使用Java Swing。这是如何根据您的要求进行堆叠的:

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

  • 丰富的小部件设置并呈现良好:这值得商bat。考虑到可以轻松地用其他库(例如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类编写包装器是程序员的时间,并且对于那些作者没有选择为其编写包装器的类来说,它不会给您带来任何好处。创建通用语法糖将使您走得更快。

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

  • 独立API文档:是。


5

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

违反您的要求:

  • 成熟和广泛使用-HTML / CSS / JS尚不成熟,ScalaJS尚不成熟(但考虑到这是令人惊讶的好选择)。因此,您可能会遇到ScalaJS特定的挂断,但是基础技术非常强大。
  • 呈现效果良好的丰富小部件集-是的。
  • 惯用的Scala-不:您将最终使用大量的jquery,这些jquery大多是动态键入的。ScalaTags在使它变得更好方面做了很多工作。
  • 有一个所见即所得但灵活的GUI构建器-是的,很多。
  • 独立的API文档(如果是包装程序,则不应让我用另一种语言引用父项目)-是的。

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


2
如果您选择朝这个方向发展(应该这样做,那么scala.js太棒了!),这里有一个非常不错的教程:lihaoyi.github.io/hands-on-scala-js。lihaoyi编写的库也很坚固-scalatags,autowire,upickle和utest-您应该将它们检出。
kornfridge

-21

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

但是...

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


JGoodies Binding是从功能上描述UI的一种非常好的方法。它的ValueModel概念与Lenses非常相似。我希望有人写一个scala包装器或实现。
Felix Leipold

1
可以从Java调用.Net吗?
vy32

Okey ...但是以这种方式,这是对这个问题的答案?
Emrys Myrooin'5
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.