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