合适,我的意思是:
- 成熟并广泛使用
- 渲染良好的丰富小部件集
- 惯用的斯卡拉
- 有一个所见即所得但灵活的 GUI 构建器
- 独立的 API 文档(如果是包装器,它不应该让我用另一种语言引用父项目)
没有特别的顺序。
哪些 GUI 工具包满足哪些条件?
合适,我的意思是:
没有特别的顺序。
哪些 GUI 工具包满足哪些条件?
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 几乎相同。
ScalaFX 是围绕 JavaFX 2 的成熟包装器。它在某些方面与 Scala Swing 表面上相似,但有一些使其脱颖而出的特性:
与本机图形库的耦合——这意味着可以访问硬件加速和其他好东西,但需要在系统上安装 JavaFX 运行时。它包含在 Java 8 的大多数主要发行版中。这也意味着它在与其兼容的系统上呈现得非常好。
属性绑定 - 这是我的杀手锏。假设我有三个元素:A
、B
和C
。A
并且B
是可调整大小的,并且C
应该具有一个高度,它是所有时间的高度之A
和B
。在 Swing 中,这将涉及编写一组自定义事件侦听器来执行这项工作。ScalaFX 绑定让您可以通过使用属性绑定运算符简单地表达这一点:C.height <== A.height + B.height
。除了其他特性之外,这也带来了一种非常 Scala 惯用的感觉。
JavaFX Scene Builder(在撰写本文时处于测试阶段)是一个所见即所得的 GUI 编辑器(不过我还没有尝试过)。
文档是它的弱点。作为一个包装器,它经常引用 JavaFX 文档。
我使用 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 文档:是的。
现在已经过去了一段时间,值得注意的是 ScalaJS 也是一个可以考虑的选项。
根据您的要求:
缺点是它将您的 GUI 从 JVM 转移到浏览器中,因此您不能使用所有这些 Java 库。
我会说使用.Net 成熟并广泛使用。
但 ...
我假设您需要使用 Scala。为此,我会坚持使用 Java,因为它在 IDEA 或 NetBeans 中具有更好的工具支持。您当然可以混合使用 Java 和 Scala。因此,您的 GUI 可以在调用 Scala 后端的 Java 中完成。还可以看看 JGoodies,他们有很多好东西可以在 Swing 中构建 UI。目前还没有对 Scala GUI 应用程序的工具支持(对于非 GUI,它仍然落后于 Java)。