JavaFX彩色圆圈
我将稍微详细说明为什么Scala,但是我相信所有这些都可以通过代码示例得到最好的说明。 SDK随附的JavaFX 2.0功能的基本示例之一是一个名为ColorfulCircles的示例应用程序。 完整的源代码可以在这里找到:
– Java彩色圆圈代码
在Sven Reimers的帮助下,我们将其移植到了ScalaFX库顶部的Scala中。 可在此处找到可用的应用程序源:
– ScalaFX彩色圆圈代码
更新 :Dean Iverson在GroovyFX中有一个很好的例子,说明了相同的代码
随意随意阅读源代码,并注意以下几点:
1. ScalaFX更简洁
ScalaFX版本的行数和字符数都更短。
代码计数(不包括许可证和进口):
- 行数:
- Java:48
- 字符:
- Java:1602
这是由于定制量身定制的DSL语言具有完整的表现力和较少的冗余。 在Java版本的代码中,您会注意到该语言所需的更多样板和语法重复。
2. ScalaFX代码看起来像输出
虽然“彩色圆圈”示例的输出非常简单,但实际上在结构化方式方面隐藏了相当多的复杂性。 这是使用ScalaFX从JavaFX 2.0 Build 45运行的输出:
您实际看到的是一个由以下几层组成的SceneGraph:
- 黑色背景的场景,包含……
- 包含以下内容的组
在阅读ScalaFX代码时,您可以通过场景中节点的对象文字样式声明来嵌套该内容,摘录如下:
// ScalaFX Scene Excerpt:
scene = new Scene {content = Seq(new Group {circles = for (i <- 0 until 30) yield new Circle { ... }}new Rectangle { ... })
}
但是,Java版本没有为您提供相同的层次结构表示,而是使用了对构造函数,getter和collection方法的命令式调用。
3.量身定制的动画语法
动画在创建良好的UI时非常常用,这就是JavaFX Script具有内置结构以简化动画创建的原因。 ScalaFX具有类似的语法,使您可以快速轻松地创建动画,该动画在ColorfulCircles示例中使用:
Seq(at(0 s) {circle.centerX -> random * 800},at(0 s) {circle.centerY -> random * 600},at(40 s) {circle.centerX -> random * 800},at(40 s) {circle.centerY -> random * 600}
)
这样可以轻松创建复杂的动画。
4. ScalaFX版本具有隐藏的奖金功能…
与JavaFX版本不同,内容绑定到舞台的宽度和高度。 ScalaFX中的绑定就像用绑定运算符(<==)替换赋值运算符(=)一样简单,如下所示:
// ScalaFX Property Setting:
width <== scene.width
height <== scene.height
尽管这是ScalaFX中操作员的简单更改,但它需要足够复杂的代码,因此他们决定从JavaFX示例中忽略它。 下面是对Java的宽松翻译:
// Java Fixed Property Binding
colors.widthProperty().bind(scene.widthProperty())
colors.heightProperty().bind(scene.heightProperty())
虽然,Java语法中的精确等效代码实际上如下所示:
// Java Dynamic Property Binding
colors.widthProperty().bind(Bindings.selectDouble(primaryStage.sceneProperty(), "width"))
colors.heightProperty().bind(Bindings.selectDouble(primaryStage.sceneProperty(), "height"))
这些版本中的任何一个都比同等的ScalaFX更复杂和笨拙,这是用于非常简单的绑定!
关于ScalaFX
ScalaFX是用Scala语言编写的UI DSL,它位于JavaFX 2.0之上(不要与Ingo Maier在Swing的功能性反应式编程方面 的出色工作相混淆)。 这意味着每个ScalaFX应用程序也是一个有效的Scala应用程序。 通过扩展,它支持与Java的完全互操作性,并且可以在支持Java虚拟机(JVM)和JavaFX 2.0的任何地方运行。
ScalaFX的一些功能包括:
程序员友好的对象文学类语法
ScalaFX使用简单的分层模式创建新对象并构建场景图。 这是一个简单的示例,该示例创建一个具有矩形的新舞台,该矩形会根据鼠标事件更改颜色:
stage = new Stage {title.value = "Hello Stage"width = 600height = 450scene = new Scene {fill = Color.LIGHTGREENcontent = new Rectangle {x = 25y = 40width = 100height = 100fill <== when (hover) then Color.GREEN otherwise Color.RED}}visible = true
}
与您在核心JavaFX API中找到的构建器不同,ScalaFX对象声明语法使用常规对象API。 这意味着您可以使用相同的运算符和方便的语法来创建和修改场景图。 同样,在构造对象时,也可以内联完成Scala块中允许的任何事情(例如变量声明,方法调用,绑定等)。 对于JavaFX构建器,您需要在完成创建对象后声明绑定,这将导致分离和难以维护的代码。
自然语言绑定表达式
将Scala语言用作DSL的最大优势之一是对操作员方法的丰富支持。 这类似于C ++运算符重载的概念,但是在其应用程序中更加统一和简洁。
ScalaFX绑定库在所有可绑定对象的顶部公开了常规运算符,例如&&,||,+,-,*,/。 而且,Scala支持运算符优先级,因此即使您在幕后创建绑定对象,它的外观也感觉像您在编写正则表达式。 因此,您具有JavaFX 2.0绑定库中可用的全部功能,其代码类似于数学表达式和运算符。 以下是一些可以使用ScalaFX绑定API进行操作的示例: 中缀加/减/乘/除/等
height <== rect1.height + rect2.height
综合运营商
width <== max(rect1.width, rect2.width, rect3.width)
条件表达式
color <== when (hover) then Color.GREEN otherwise Color.RED
复杂的布尔表达式和字符串连接
text <== when (rect.hover || circle.hover && !disabled) then textField.text + " is enabled" otherwise "disabled"
自由格式的无效和变更处理程序
rect.hover onInvalidate {needsRepaint = true
}
完全类型安全的API
这似乎似乎无关紧要……类型安全性是Java开发人员一直拥有的(并且常常认为是理所当然的),而使用其他脚本语言的开发人员则没有(并且在不知不觉中遭受运行时错误的困扰)。 但是,如果要开发的应用程序在部署后不会出现意外的运行时错误和错误,则此功能至关重要。
一个好的编译器将能够通过比较预期类型和实际类型来发现许多常见的编码错误,而一个好的编译器(例如Scala)将为您自动推断类型,因此您不必在整个代码中繁琐地重复它们。
ScalaFX通过类似脚本的DSL语法获得了两全其美的优势,您几乎不需要显式地键入对象,而Scala编译器具有强大的类型安全性,可以推断并检查每个表达式和API调用的类型。 这意味着更少的时间花费在调试怪异的代码错误和拼写错误上,而质量更高的代码马上就可以使用了!
无缝的JavaFX / ScalaFX互操作性
通常情况下,您对代码库或包含功能的库的主要语言没有完全的自由。 即使在具有Java,Scala以及可能还有其他JVM语言的混合环境代码库中,ScalaFX也会无缝地进行转换和互操作。
ScalaFX通过Scala的隐式运算符功能获得此功能。 程序在需要JavaFX类型的对象的任何地方,它将自动插入代码以将ScalaFX包装的对象转换为JavaFX本机类。 每当您使用ScalaFX特定功能时,编译器都会自动创建一个ScalaFX包装器对象,该对象可用于调用高级方法并访问全部功能。 所有这一切都在幕后发生,使您可以专注于编写简洁的代码,而不必大为担心集成和互操作性。
由于所有这些互操作性魔术都在幕后发生,因此您的应用程序会有一些额外的开销。 我们已尽力使用Scala语言中的@specialize之类的功能来最小化此问题,这使我们能够避免在基元上进行装箱和拆箱。 但是,没有真正的基准,很难说出我们所做的工作有多好。 希望在以后的文章中对此有更多的了解。
了解有关ScalaFX的更多信息
ScalaFX项目站点由Google Code托管,其中包括一些邮件列表,如果您有兴趣,则应加入该列表:
- ScalaFX用户
- ScalaFX开发人员
在撰写本文时,我们还没有捆绑发行版,但对早期采用者的反馈感兴趣。 如果您想尝试一下,请下载源代码并快速旋转一下!
在即将举行的Dean Iverson的JavaOne研讨会上,我将获得有关ScalaFX的更多详细信息,主题为“ 带有替代语言的JavaFX 2.0 ”。 来听听有关Scala,Groovy和其他JVM语言的更多信息,您可以使用它们编写更简单,更简洁的代码。
参考: JavaFX 2.0和Scala,例如来自我们JCG合作伙伴的 牛奶和饼干 Steve On Java博客上的Stephen Chin。
翻译自: https://www.javacodegeeks.com/2012/02/javafx-20-and-scala-like-milk-and.html