JavaFX 2.0和Scala都是很好的技术,但是一起使用时效果会更好。 JavaFX 2.0是一种功能强大的富客户端技术,具有先进的图形,动画和媒体功能。 Scala是一种简单但功能强大的语言,具有用于编写特定于域的语言(DSL)的高级语言功能。 在您的JavaFX 2.0项目中添加一个Scala UI DSL,您将处在饼干和奶油的天堂!

罗比摄影艺术 授权的延时摄影创意共享

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的功能性React式编程方面 的出色工作相混淆)。 这意味着每个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

JavaFX 2.0和Scala,例如牛奶和饼干相关推荐

  1. JavaFX 2.0和Scala,像牛奶和饼干

    JavaFX 2.0和Scala都是很好的技术,但是一起使用时效果会更好. JavaFX 2.0是一种功能强大的富客户端技术,具有先进的图形,动画和媒体功能. Scala是一种简单但功能强大的语言,具 ...

  2. JavaFX 2.0 beta示例应用程序和思考

    我有一段时间回过头来玩JavaFX,并且在使用该语言方面有好有坏的经验. 随着JavaFX 2.0 beta的发布,我想尝试一下. 在这里,我开发了一个简单的地址解析应用程序,该应用程序将使用Goog ...

  3. 纯Java JavaFX 2.0菜单

    在有关JavaFX的最新文章中 ,我集中讨论了不使用JavaFX 1.x的JavaFXScript和不使用JavaFX 2.0的新FXML来使用JavaFX 2.0的新Java API . 所有这些示 ...

  4. JavaFX 2.0布局窗格– BorderPane

    BorderPane非常适合开发更复杂的布局. 通常, BorderPane提供五个不同的区域:顶部,右侧,底部,左侧和中央. 您可以通过调用setTop/setBottom/set-方法将Node设 ...

  5. JavaFX 2.0布局窗格– FlowPane和TilePane

    FlowPanes和TilePanes是不错的布局窗格,如果您想一个接一个地连续地水平或垂直地布局子级,则可以. 它们彼此非常相似,因为它们都将子级布置成列(在水平Flow / TilePane的情况 ...

  6. Hello JavaFX 2.0:命令行介绍

    我从博客文章Hello JavaFX 2.0:NetBeans 7.1 beta的介绍中,从NetBeans 7.1 beta的角度看了一个无处不在的Hello World示例的简单JavaFX版本. ...

  7. JavaFX 2.0布局窗格– HBox和VBox

    如果要对JavaFX 2.0中所有不同的布局窗格进行概述,或者想了解有关它们的一些基本知识,请参阅我以前的文章< JavaFX 2.0中的布局窗格> . 布局窗格HBox和VBox绝对是J ...

  8. JavaFX 2.0布局窗格– GridPane

    毫无疑问, GridPane是JavaFX 2.0中功能最强大,最灵活的布局窗格. 它在由行和列组成的灵活网格中布置其子项,与Swing的GridBagLayout或HTML的表格模型非常相似. 这种 ...

  9. JavaFX 2.0 Hello World

    在讨论示例本身之前,我想向您展示如何在NetBeans中创建JavaFX应用程序. (如果尚未安装JavaFX和NetBeans,请参阅我以前的文章< 安装JavaFX 2.0和NetBeans ...

最新文章

  1. Jmeter工具的使用——功能测试
  2. ggbiplot-最好看的PCA作图:样品PCA散点+分组椭圆+变量贡献与相关
  3. 【数据库系统概论】考研第六部分重点分析【6.1】
  4. struts2 标签不能使用EL 表单式
  5. 实验 7 场景运行监控及性能测试结果分析_实验报告--软件功能测试与性能测试实验
  6. table每行自动触发ajax,table.ajax.reload()成功后未触发:function()
  7. suse下删除mysql_每日MySQL之005:SUSE linux下卸載MySQL
  8. shell的交互式和非交互式登录
  9. Docker 跨主机网络方案分析
  10. pandas遍历dataframe_chapter2-4 常用数据处理包Pandas整理4
  11. VF 动态规划系列dp入门
  12. matlab 卷积改变步长,转载“MATLAB卷积函数改进”
  13. 基于等效积分形式的近似方法——加权余量法(配点法,伽辽金法)求解微分方程近似解
  14. CSS的BEM命名规范
  15. paho.mqtt.c的Linux编译与交叉编译
  16. android 爱加密 脱壳,简单尝试脱“爱加密”官网加固的DEX壳
  17. JAVA-消息队列及分布式消息队列原理
  18. Unity ScrollView图片滑动翻页效果
  19. 同步或者重构Activiti Identify用户数据的多种方案比较
  20. .Net Core学习笔记(二)MVC框架

热门文章

  1. JavaFX之TableView
  2. layui如何实现添加数据时关闭页面层,并实时刷新表格数据?
  3. Sublime Text 3 快捷键总结(拿走)
  4. 2014蓝桥杯-B-省赛-五-圆周率
  5. php 接收文件 错误代码3,php上传文件错误代码3
  6. grub shell 错误_使用grub-install修复Grub时出错
  7. spring data jpa是什么?
  8. java异常了还会往下走吗_异常一个问题,请帮下忙:处理异常后,程序会继续往下运行吗...
  9. jQuery中的几个案例:隔行变色、复选框全选和全不选
  10. spring 注释_Spring@主要注释