合适的,我的意思是:
没有特别的顺序。
哪些GUI工具包满足哪些条件?
答案 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几乎相同。
答案 1 :(得分:21)
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-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-core和redo-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也是一个可以考虑的选择。
违背您的要求:
缺点是它会将您的GUI从JVM移到浏览器中,因此您无法使用所有这些Java库。
答案 4 :(得分:-19)
我说使用.Net成熟并广泛使用。
但是......
我假设您需要使用Scala。为此,我坚持使用Java,因为它具有更好的工具支持,如IDEA或NetBeans。你当然可以混合使用Java和Scala。因此,您的GUI可以使用Java调用Scala后端来完成。另外看看JGoodies他们有很多很好的东西在Swing中构建UI。目前,没有Scala GUI应用程序的工具支持(对于非GUI,它仍然落后于Java)。