JavaFX 2.0和Scala,例如牛奶和饼干

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356888.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

thinkphp+mysql+join+where_thinkphp5.0 多join时where无法between

情况类似于这个链接,这帖子的老哥没有答案,现在遇到一样的问题了,下面贴上代码$map [products.insurance_status>1];//是否计算下线的产品if( input(get.times) && input(get.times) < 7 ){$time return_times(input(get.times));//此处有bug$map[order.pay_ti…

访客设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01; 目录 …

报名照片审核处理工具_太浦军考|2020年文职人员报名照片审核程序,照片处理工具应该如何使用?...

考文职 找太浦 最靠谱照片处理工具使用说明01注意&#xff1a;一、本工具是报名照片审核处理工具&#xff0c;只有通过该审核工具审核通过的照片才能在注册时正常上传。照片将应用在准考证和合格证书中。二、源文件必须是标准证件数字照片&#xff0c;JPG或JPEG格式&#xff0c…

python 比赛成绩预测_Python预测NBA比赛结果

下载W3Cschool手机App&#xff0c;0基础随时随地学编程导语利用Python简单地预测一下NBA比赛结果。。。这大概就叫蹭热度吧。。。毕竟貌似今天朋友圈都在刷NBA相关的内容。。。虽然我并不能看懂。。。但这并不妨碍我瞎预测一波。。。So,以下内容纯属瞎玩&#xff0c;如有雷同&a…

适配器设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01; 目录 …

cesium鼠标控制键盘_Cesium中级教程3 - Camera - 相机(摄像机)

CameraCesiumJS中的Camera控制场景的视图。有很多方法可以操作Camera&#xff0c;如旋转(rotate)、缩放(zoom)、平移(pan)和飞到目的地(flyTo)。CesiumJS有鼠标和触摸事件用来处理与Camrea的交互&#xff0c;还有API来以编程方式操作摄像机。了解如何使用Camera API和自定义相机…

windows下统一mysql编码_mysql5.7 windows7编码统一utf-8

查看mysql数据编码登录mysql服务&#xff0c;查看mysql数据库默认的编码mysql> show variables like character%;---------------------------------------------------------------------------| Variable_name | Value |------------------------------------------------…

python读取配置文件失败原因_python读取配置文件报keyerror-文件路径不正确导致的错误...

- 在其他模块使用反射读取配置文件报错&#xff0c;但是在反射模块中读取GetData.check_list又是正确的反射模块如下&#xff1a;# get_data.pyfrom API_AUTO.p2p_project_7.tools import project_pathimport pandas as pdfrom API_AUTO.p2p_project_7.tools.read_config impor…

备忘录设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01; 目录 …

打印机一直显示正在删除不掉怎么办?

1、停止打印服务&#xff0c;按WinR键打开运行对话框&#xff0c;然后输入“services.msc ” 打开任务管理。 找到“Print Spooler”&#xff0c;先停止该服务。 按WinR键打开运行对话框&#xff0c;然后输入“Spool” 回车打开“spool” 文件夹&#xff0c;打开“PRINTERS”文…

java 并发 面试_Java 并发基础常见面试题总结

1. 什么是线程和进程?1.1. 何为进程?进程是程序的一次执行过程&#xff0c;是系统运行程序的基本单位&#xff0c;因此进程是动态的。系统运行一个程序即是一个进程从创建&#xff0c;运行到消亡的过程。在 Java 中&#xff0c;当我们启动 main 函数时其实就是启动了一个 JVM…

javafx动画_JavaFX:创建Sprite动画

javafx动画到目前为止&#xff0c;尽管我的大多数文章都涉及JavaFX属性和绑定&#xff0c;但是今天我想写一讲我也致力于JavaFX运行时的另一部分&#xff1a;动画API。 在本文中&#xff0c;我将解释如何在JavaFX中编写自定义动画&#xff0c;以及如何使用这种方法为Sprite动画…

FZU Problem 2238 Daxia Wzc's problem

Daxia在2016年5月期间去瑞士度蜜月,顺便拜访了Wzc,Wzc给他出了一个问题&#xff1a; Wzc给Daxia等差数列A(0),告诉Daxia首项a和公差d; 首先让Daxia求出数列A(0)前n项和,得到新数列A(1); 然后让Daxia求出数列A(1)前n项和,得到新数列A(2); 接着让Daxia求出数列A(2)前n项和,得到新…

生成器设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01; 目录 …

【转】从 ArcGIS for Desktop 发布地图服务

原文链接&#xff1a;http://resources.arcgis.com/zh-CN/help/tutorials/01z300000007000000.htm 本教程的目的是将地图服务直接从 ArcGIS for Desktop 发布到 ArcGIS for Server 中。本教程与名为“在 ArcMap 中准备您的 Web 地图”的上一教程类似&#xff0c;需要使用 ArcGI…

java 模块化osgi_OSGi简介–模块化Java

java 模块化osgiOSGi联盟是这种搁浅的管理机构&#xff0c;它始于1999年。其最初目标是为网络设备创建开放搁浅。 基于此思想&#xff0c;此规范也针对Java引入。 Eclipse在Java中是第一个。 他们于2004年6月推出了基于OSGi的Eclipse IDE。 OSGi是在Java中定义动态模块的方法。…

Train Problem I hdu 1022(栈)

http://acm.split.hdu.edu.cn/showproblem.php?pid1022 题意&#xff1a;给出火车的进站与出站顺序&#xff0c;判断是否可以按照给出的出站顺序出站。 #include <iostream> #include <stdio.h> #include <string.h> #include <string> #include <…

Spring数据和Redis

本文是我们学院课程的一部分&#xff0c;标题为Redis NoSQL键值存储 。 这是Redis的速成班。 您将学习如何安装Redis并启动服务器。 此外&#xff0c;您将在Redis命令行中乱七八糟。 接下来是更高级的主题&#xff0c;例如复制&#xff0c;分片和集群&#xff0c;同时还介绍了…

史上最全的SpringMVC学习笔记

SpringMVC学习笔记---- 一、SpringMVC基础入门&#xff0c;创建一个HelloWorld程序 1.首先&#xff0c;导入SpringMVC需要的jar包。 2.添加Web.xml配置文件中关于SpringMVC的配置<!--configure the setting of springmvcDispatcherServlet and configure the mapping-->&…

shader weaver_Oracle通过邀请Weaver和Chin推动JavaFX向前发展

shader weaver昨天&#xff0c;我发布了愚人节帖子&#xff0c;内容涉及加入NASA协助探索红色大行星。 那篇文章与事实相距不远……美国宇航局开发的技术的所有细节都是100&#xff05;准确的。 哎呀&#xff0c;即使我辞职也是事实&#xff01; 唯一不正确的部分是我将加入的公…