JavaFX 2.0和Scala,像牛奶和饼干

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

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

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

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

相关文章

ASP.NET WebAPi之断点续传下载(上)

前言 之前一直感觉断点续传比较神秘&#xff0c;于是想去一探究竟&#xff0c;不知从何入手&#xff0c;以为就写写逻辑就行&#xff0c;结果搜索一番&#xff0c;还得了解相关http协议知识&#xff0c;又花了许久功夫去看http协议中有关断点续传知识&#xff0c;有时候发觉东西…

贪吃蛇(C++实现,VC6.0编译,使用了EasyX图形库)

程序效果&#xff1a; 代码&#xff1a; //main.cpp 1 #include <iostream>2 #include<fstream>3 #include <graphics.h>4 #include <conio.h>5 #include<ctime>6 #include<windows.h>7 #include<mmsystem.h>8 #pragma comment(lib…

3.0 C++远征:is a

4-4is_a 0.派生类Soldier继承自基类Person //Person.h class Person { public:Person(string name "Jim");~Person();void play(); protected:string m_strName; };//Soldier.h class Soldier : public Person { public:Soldier(string name "James", in…

python中sorted的用法append_python sorted()排序详解

排序&#xff0c;在编程中经常遇到的算法&#xff0c;我也在几篇文章中介绍了一些关于排序的算法。有的高级语言内置了一些排序函数。本文讲述Python在这方面的工作。供使用内置函数sorted()/list.sort()的使用简单应用python对list有一个内置函数&#xff1a;>>> a[5…

云上的播放框架变得简单:Openshift模块

仅仅几年前&#xff0c;找到一个负担得起的Java Web应用程序托管解决方案是一项艰巨的任务&#xff0c;而寻找免费的托管解决方案是一项不可能的任务。 更不用说甚至考虑自动缩放&#xff0c;单命令部署&#xff0c;持续集成等事情&#xff0c;这都是科幻小说。 去年见证了云计…

C#中的yield return与Unity中的Coroutine(协程)(下)

Unity中的Coroutine&#xff08;协程&#xff09; 估计熟悉Unity的人看过或者用过StartCoroutine() 假设我们在场景中有一个UGUI组件&#xff0c; Image&#xff1a; 将以下代码绑定到Image 1 using UnityEngine;2 using System.Collections;3 using System.Threading;4 using …

字节流转化为文件流_C#文件转换为字节流及字节流转换为文件

本文讲解了C#实现文件转换为字节流的方法。文件转换为字节流的步骤如下1、通过文件流打开指定文件(FileStream fs)&#xff1b;2、定义字节流(byte[] fileBytenew byte[fs.Length])&#xff1b;3、把文件读取到字节流(fs.Read(fileByte,0,fileByte.Length))&#xff1b;4、关闭…

Spring和JSF集成:导航

我希望这是有关我在Spring和JavaServer Faces之间提供深度集成的努力的一系列博客中的第一篇。 这里提到的所有内容都是“正在进行中的工作”&#xff0c;因此&#xff0c;如果您签出代码&#xff0c;请注意它是一个不断变化的目标。 期待一些粗糙的边缘&#xff0c;如果有时会…

【CSS3动画】transform对文字及图片的旋转、缩放、倾斜和移动

前言&#xff1a;之前我有写过CSS3的transform这一这特性&#xff0c;对于它的用法&#xff0c;还不是很透彻&#xff0c;今天补充补充&#xff0c;呵呵 你懂的&#xff0c;小司机准备开车了。 a)再提一提transform的四个属性 ①旋转--->rotate(参数a)&#xff0c;单位deg&a…

宏的用法与简介

预处理指令&#xff1a;例如&#xff1a;#include<stdio.h> #include<stdlib.h> #define MAX 20 ............. 因为他们由预处理器解释的&#xff0c;所以称作预处理指令。预处理器读取源代码&#xff0c;然后对其修改&#xff0c;并把修改过的…

django 日志写入mysql_如何将django orm模型 写入数据库

1、指定连接pymysql(python3.x)先配置_init_.pyimport pymysqlpymysql.install_as_MySQLdb()2、配置连接mysql文件信息settings.pyDATABASES {default: {ENGINE: django.db.backends.mysql,NAME: django_orm, #你的数据库名称USER: root, #你的数据库用户名PASSWORD: , #你的数…

ORM的问题第2部分–查询

在我以前关于对象关系映射工具&#xff08;ORM&#xff09;的帖子中&#xff0c;我讨论了在处理当今常见的ORM&#xff08;包括Hibernate&#xff09;时遇到的各种问题。 其中包括与从POJO生成架构有关的问题&#xff0c;实际性能和不断出现的维护问题。 本质上&#xff0c;结论…

【转】如何减少接口响应时间

Premature optimization is the root of all evil. — Donald Knuth 对于程序优化&#xff0c;我一直采取保守的态度&#xff0c;除非万不得已。但是随着业务的不断发展&#xff0c;程序越来越复杂&#xff0c;代码越写越多&#xff0c;优化似乎是终有一天会到来的事情。 那么对…

数据库行转列在现实需求中的用法

select t.客户姓名,sum(case when t.收款类型首款 then t.金额 else 0 end as 首款),sum(case when t.收款类型尾款 then t.金额 else 0 end as 尾款) from table t group by t.客户姓名 这段sql的意思 是 查询出所有客户收款信息 然后按客户分组 分组后 然后将这个客户的所…

mysql生产环境加索引_【生产篇】_MySQL环境下如何查看基于表的索引定义

【引言】今天中午项目组来一需求&#xff0c;欲在MySQL环境的某张表下创建几个BTREE索引。要创建索引&#xff0c;首先需要了解基表的表结构&#xff0c;以及已经包含的索引。Oracle的表结构大家都很熟悉&#xff0c;但MySQL表结构和已创建索引的查看怎么操作&#xff0c;本文将…

Hadoop模式介绍-独立,伪分布式,分布式

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

apk反编译方式

一、Apk反编译得到Java源代码 下载上述反编译工具包&#xff0c;打开apk2java目录下的dex2jar-0.0.9.9文件夹&#xff0c;内含apk反编译成java源码工具&#xff0c;以及源码查看工具。 apk反编译工具dex2jar&#xff0c;是将apk中的classes.dex转化成jar文件 源码查看工具jdgui…

优化Hibernate所鼓励的7大措施

优化Hibernate所鼓励的7大措施&#xff1a; 1.尽量使用many-to-one&#xff0c;避免使用单项one-to-many2.灵活使用单向one-to-many3.不用一对一&#xff0c;使用多对一代替一对一4.配置对象缓存&#xff0c;不使用集合缓存5.一对多使用Bag 多对一使用Set6.继承使用显示多态 HQ…

如何用c 控制mysql数据库_用C语言操作MySQL数据库

函数描述mysql_affected_rows()返回上次UPDATE、DELETE或INSERT查询更改&#xff0f;删除&#xff0f;插入的行数。mysql_autocommit()切换autocommit模式&#xff0c;ON/OFFmysql_change_user()更改打开连接上的用户和数据库。mysql_charset_name()返回用于连接的默认字符集的…

数据结构(RMQ):POJ 3624 Balanced Lineup

Balanced LineupDescription For the daily milking, Farmer Johns N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer John decides to organize a game of Ultimate Frisbee with some of the cows. To keep things simple, he will take a conti…