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,一经查实,立即删除!

相关文章

两张图片互相切换

图片切换 $(.selectarea img).click(function () { if ($(this).attr("src") "/Content/images/persornalZL/select01.jpg") { $(this).attr("src", "/Content/images/persornalZL/select02.jpg"); } else { $(this).attr("src&…

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; 目录 …

console.log()与alert()的区别

1、alert() a、有阻塞作用&#xff0c;不点击确定&#xff0c;后续代码无法继续执行 b、alert只能输出string&#xff0c;如果alert输出的是对象&#xff0c;会自动调用toString()方法 eg&#xff1a;alert([1,2,3]);//1,2,3 c、alert不支持多个参数的写法&am…

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

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

ANT基本操作

1.输入输出 1.1 输入   不能执行交互式操作。只能采取下面的形式&#xff1a; 1.1.1 变量 ① 其中已经预定义的变量有&#xff1a; 属性 解释 ant.file 该构建文件的完整地址 ant.version 安装的 Apache Ant 的版本 basedir 构建文件的基目录的绝对路径&#xff0c;作…

hadoop伪分布式模式_Hadoop模式介绍-独立,伪分布式,分布式

hadoop伪分布式模式了解了什么是Hadoop之后&#xff0c;让我们在单机上启动Hadoop&#xff1a; 这篇文章包含在ubuntu上安装Hadoop的说明。 这是Hadoop安装的快速分步教程。 在这里&#xff0c;您将获得以独立模式 &#xff08;单节点集群&#xff09;安装Hadoop所需的所有命令…

SSH面试题【转】

SSH面试题整理 http://blog.csdn.net/xuyuxin8145/article/details/6638084 1. BeanFactory的作用是什么&#xff1f; [中] BeanFactory是配置、创建、管理bean的容器&#xff0c;有时候也称为bean上下文。Bean与bean的依赖关系&#xff0c;也是由…

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

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

ffmpeg摄像头推流

ffmpeg -f dshow -i video"Integrated Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f mpegts udp://230.0.0.1:6000 默认是640x480 我I5的机器用了10%的CPU -r 25 设置帧率 -s 1280x720 指定分辨率 默认640x480 -g 1 -keyint_min 2 设置关键帧…

python简单实用案例_Ajax的简单实用实例代码

细说SSO单点登录(转)OAuth2.0:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-security.html#boot-features-security-oauth2-resource-serverhttp...文章developerguy2016-07-131080浏览量怎样在不使用框架的基础上开发一个 Javascript 组件本…

适配器设计模式示例

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

[转]Linux下g++编译与使用静态库(.a)和动态库(.os) (+修正与解释)

在windows环境下&#xff0c;我们通常在IDE如VS的工程中开发C项目&#xff0c;对于生成和使用静态库&#xff08;*.lib&#xff09;与动态库&#xff08;*.dll&#xff09;可能都已经比较熟悉&#xff0c;但是&#xff0c;在linux环境下&#xff0c;则是另一套模式&#xff0c;…

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

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

JAVA Junit error java.lang.SecurityException: class junit.framework.JUnit4TestCaseFacade

运行junit4时报错: java.lang.SecurityException: class "junit.framework.JUnit4TestCaseFacade"s signer information does not match signer information of other classes in the same package at java.lang.ClassLoader.checkCerts(Unknown Source) at java.lan…

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

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

复制选中的listbox内容

private void lt_log_MouseClick(object sender, MouseEventArgs e){Clipboard.SetDataObject(lt_log.SelectedItem.ToString()); }转载于:https://www.cnblogs.com/XuPengLB/p/5779554.html

heroku_WhateverOrigin –与Heroku和Play对抗原产地政策! 构架

heroku不久前&#xff0c;在编写 Bitcoin Pie时 &#xff0c;我发现有必要克服臭名昭著的Same Origin Policy &#xff0c;该政策限制了运行在客户端浏览器上的javascript可以访问的域。 通过Stack Overflow&#xff0c;我找到了一个名为Any Origin的站点&#xff0c;这基本上是…

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; 目录 …