“JavaFX”目录存档

Java代码调用JavaFX的例子

2009年06月23日,星期二

在JavaFX 1.0发布之后,本人撰写的文章JavaFX和Java之间的互操作性被各网站转载。文中总结了3种从Java调用JavaFX的方法。这三种方法分别为: http://www.javafxblogs.com

1. 用ScriptEngineManager类。这是基于JSR-223规范的java脚本API( scripting API)。可以在java程序中运行一些脚本,如 JavaFX script, javascript等。
2. 通过JavaFX reflection API。这是JavaFX提供的反射API,几乎可以调用所有的JavaFX类。
3. 先用JavaFX类实现一个Java的interface,然后Java程序可以通过这个interface来调用JavaFX的功能。这中间的interface起了个桥梁的作用。

第三种方法应该是比较“正规”而且“优美”的调用方式。但是也有一点不足:程序代码的入口必须从JavaFX启动。这是因为JavaFX程序比 较容易生成JavaFX类的实例,从而可以供Java方使用。可是我们有时会碰到一些特定的情况,需要从Java端启动代码。例如,如果你已经有了一个较 完整的Java程序,你需要用调用JavaFX的某些功能,这时候较好的方法是把Java作为程序的入口。为了解决这个问题,我把第2和第3种方法作了融 合,大家可以看看下面的例子。纯Java代码调用JavaFX的例子

www.JavaFXblogs.com

下一步是创建JavaFX类MyChart来实现这个interface:

www.JavaFXblogs.com www.JavaFXblogs.com

www.JavaFXblogs.com
在代码中,这3句是创建JavaFX类javatest.MyChart实例,

    Context context = FXLocal.getContext();
    FXClassType instance = context.findClass("javatest.MyChart");
    ObjectValue obj = (ObjectValue)instance.newInstance();

而一下这句则是把JavaFX实例转化为Java可用的对象:

    JavaInterface ji = (JavaInterface)obj.asObject();

如果你用的是NetBeans IDE, 你可以在项目属性中把javatest.JavaTest类设为主类(Main class)(即启动类)。编译之后会生成一个javatest.jar文件。程序运行的结果如图:

Java PieChart via JavaFX
在命令行中可以采用以下方式: http://developers.sun.com/blog/henry

   javafx -jar javatest.jar

实际上,可以用纯Java的方式来启动程序,只要把JavaFX的运行环境带上即可,如:JavaFX程序例子、教程

 java -Djava.library.path="<path to javafx sdk lib>"
     -classpath "<all javafx sdk jars>" -jar javatest.jar

因为JavaFX需要的jar文件很多,因此这种“最纯”的java方法使用起来比较麻烦。我觉得还是用javafx命令简洁些, 而且javafx就是上述java命令的封装而已。

如果有问题,请留言讨论。

本文的英文译文同步发表于:Calling JavaFX Classes from Pure Java Code. 中文同步发表于:用纯Java代码调用JavaFX的功能

JavaFX 1.2中的五大重要性能

2009年06月22日,星期一

在已经结束的JavaOne大会上推出了许多与JavaFX相关的产品,其中一些是关于未来的产品,还有一些则尚未发布。本文当然不会对此一一列举。 在JavaOne会议期间讨论了许多议题,而笔者认为JavaFX最关键的一些性能可能被忽略了。在本文中,笔者将谈及的是一些你现在实实在在能下载且使 用的功能。本文中谈及的均是JavaFX的新版本,也就是以前代号为Marina,现在称为JavaFX 1.2的版本。闲话少说,以下是本人总结的五大重要性能。

支持Linux和Solaris

在Linux和Solaris之下对JavaFX的支持已经让我们等了相当长一段时间。经历千辛万苦,我们现在终于迎来了测试版。我们的目标是让 Solaris和Linux成为JavaFX世界中与Windows和Mac具有同等地位的平台。JavaFX的目标是要让一种Java能适应所有屏幕以 及所有的操作系统。这是向该目标又靠近了一步。

有些功能还不能使用,这也是为什么我们称其为测试版的原因,但是它仍然是一个良好的开 端。我们现在使用支持视频的GStreamer,曾是缺少的一个关键性能。你有可能会获得一些图像硬件加速功能,当然这要取决于你的distro组件和配 置。阴影窗口还不能使用。这是因为基础JRE中存在漏洞。负责图形处理的程序师称他们已经针对这一漏洞开发出了补丁,而该补丁预计会在不久后的Java6 和OpenJDK中推出,因此你不需要等到下一版本的 JavaFX。

控件和布局

JavaFX具备非常好的图形处理但是在1.0版本中只有单独的本地用户界面控件TextBox。而仅仅是使用文本控件很难制作出真正意义上的商业应用 程序。这一切现在都有所改变。JavaFX 1.2 拥有真正适合21世纪的用户界面控件。我们总是在爱恨中徘徊,思考着长远的用户界面工具包的发展趋势。然后我们会创建出新的控件并且API布局,这些努力 解决了人们所需的一部分应用程序。而这里只是对新控件粗略做一下介绍:

·所有的控件都可以用CSS更换皮肤,因此设计师可以创造出一般式样的程序。

·存在一个默认的控件观感Caspian。

·控件位于公用文件参数中,这意味着他们可以在所有设备上运行而不只是桌面。

·用于标准性能的新型控件,如进程指示器和超链接。

·都是建立在JavaFX布景图之上,因此不会有剩余的AWT。

和这些控件一起出来的是布局系统,它能处理AWT布局的问题。现在要将布局和动画综合起来就变得非常容易了,而且只需用几行代码就可以创建自定义的布局。使用这些控件,我们可以创建真正意义上能跨屏幕运行的商业程序。

当前列表中缺少一些控件。尤其是Tablet和Tree的缺失。这并不意味着开发团队无意向其中添加这些控件。主要是因为没有足够的时间来添加。不过将来这些控件还是会提供的。

和控件一起用来创建商业程序的另一个重要性能是图表。图表是JavaFX中创建的一种非常常见的请求。所有的标准图表类型包括饼图,分散图和条形图,使用起来是十分便捷的。你还可以用代码来创建自己需要的图表类型。下面是几个示例:

数据:持久性,RSS/Atom和任务

以前,你只能通过下降到Java代码的办法才能使用数据。这个办法通常都有用,除非移动Java代码与桌面Java代码不同。此外,每种形式的 Java都有自己的独有API可以保持数据。为了解决这一问题,开发团队在JavaFX公用参数文件中添加了新的支持以便保留这种平台差异。以下是新添加 的一些支持:

·javafx.io.Storage 用来在任意客户平台上实现本地数据的保留

·javafx.data.feed.* 对RSS和Atom数据的嵌入式支持

·DateTime,Math,and Properties 作为JavaFX类

·javafx.async.* 用于JavaFX中所有异步操作的基本类,包括执行Java任务的方式。

速度

JavaFX的目标就是让每个使用它的人都享受到更快的更新速度。你会发现JavaFX 1.2要比1.1和1.0更快。从启动时间,内存使用情况和图形处理性能来看,每个部分的性能都有所改进。对于某些任务其性能更是有了多达三倍的改进。

为了实现这种速度的改进,程序员重新审视过整个平台。编译器从使用真正多重继承转为Mixins。这样就消除了多重继承的弊病。附带的好处就是基本汇编代码变得更小且更快。

图形开发小组花了大量的时间来重新设计场景图以便实现更智能化的场景更新。其结果是减少了用户重新绘制的次数,带来了反响更好的用户界面。

在视频和音频堆栈以及基本图形流水线里都存在漏洞补丁。此外,减少了启动时间并改善了Webstart的性能。总之你会发现JavaFX 1.2为用户带来了比以往更为快速而流畅的体验。

上述五个性能还只是JavaFX 1.2中的很小一部分。最重要的一点是这些都是JavaFX开发计划的一部分。更快与更小的特性确保了程序员能高速高效地为客户开发出高质量的软件。

国际:JavaFX 1.1 发布,技术大牛之初体验

2009年02月16日,星期一

【CSDN 2月17日 国际观点】本文来自Osvaldo Pinali Doederlein在java.net的科技博客,全文内容如下:

下载,如果你已经有了NetBeans 6.5,那你只需要检测到升级补丁即可(下载量为53Mb)。

首先,谈一下从Release Notes和一些调查中得到的对JavaFX 1.1的主要印象:

1,    JavaFX Mobile的官方支持:“官方”一词,我想Sun指的是v1.0 品质。然而这仍不算是个真正的FCS,因为只有在真正的设备上运行runtime时它才是。

2,    一些JavaFX Script语言性能的提升;

3,    语言性能和稳定性的提升。在release notes中没有bug清单,所以你必须在JIRA中查询,JavaFX 1.1发布的codename是Franca,修补了148个补丁(增加了7个未修复的)。尽管其中的一些补丁不足为题(如说明文档、凌乱的教程)但从 1.0.1到JavaFX 1.1发布的两个月的时间内,修补的bug数量仍然相当可观。

4,    JavaFX桌面的全屏模式。看起来这是1.0版本的重要特性,但是被差劲的说明文档和几个bugs给拖累了。

5,    javafx.fxd包,之前是一个扩展的lib,现已添加到core中(常规文档)。除了FXDLoader,你还可以克隆SceneGraph项目 (使用Duplicator类)而且不需要配置库(尽管这可能比你的applet还大)。我仍在等待更加常规的克隆特性。

6,    升级的文档(这仍是JavaFX的一个弱点)。我注意到升级的javadocs,但是Language Reference看起来根本就没有升级。尽管JavaFX的指导材料越来越多,但我还是倾向于好的整齐的官方指导。

提升和兼容性

唯一的语言变化看起来好像在typesystem:JavaFX Script现在支持所有Java基本类型(Java primitive types),像通常的大写名字如Long,尽管编译器会尽可能地避免将对象封装。如果硬要说的话,好的一点是JavaFX更加像Java了,高效、与大 量Java代码集成整合。

这种改变的另一个方面是JavaFX的Number类型变成了float而不是double。这是一个不错的改变,对FP来说,floats在 JavaFX(GUI & graphics)的领域内更加流行:尽管你在一些地方比如transforms中会用到double,但大部分的toolkits,乃至3D APIs包括Java2D,都使用float精密度来定义像屏幕坐标之类的东西。在JavaFX中,有时我们不得不使用double精度的Number来 定义更大的整数(比如毫秒级时间间隔)。

但这种改变也会带来代码的破坏。拿我的JavaFX Balls代码来说,当我运行到新的runtime时,看起来工作了但是FPS计数器疯了,报告2147483647帧!!(这是 0×7FFFFFFF)。我轻松地修改了这个问题:我将couple变量声明从Number改到了Long。

这个问题对于来自Sun的开发工具来说有点让人吃惊,而且你永远都会期望向后兼容。但是很高兴的是Sun总是在修复他自己操之过急做出的错误决定,尤其是 许多终端的JavaFX设备还没有被开发出来。运行时间可以执行,无论是1.0.1还是1.1,都配置在插件的cache中,每个 applete/JAWS应用都使用为之构建的runtime,所以现有的JavaFX applets不会被打破,只是它们不能够自动运行在新的已经升级的runtime上而已。

性能

从我开发的产品JavaFX Balls来看,JavaFX 1.1与之前的版本性能几乎一样,更多数量的balls的问题仍然存在。而且这个问题看来不会在版本1.1中迅速修复,我预计最早也会在v1.5 (Marina)中得到显著改善,因为整个Scenario runtime正在加强,而且,JavaFX将会获取到一整包的‘native’ (SceneGraph-based)组件,增加了V-sync动画制作和其他重要的提升。

我没有做更多的测试,JavaFX Balls被局限在JavaFX-centric的基准点,原因之一是这甚至不会抓取Effects框架。而且现在JDK 6u14-ea-b01具有6u12+特性,被JavaFX 1.1和G1 collector获取。早在JDK 7 builds中我就测试过G1,很慢很崩溃,所以我并不看好6u14-ea-b01版本会完美。

JavaFX Mobile

移动程序的开发的确需要很大的提升。我已经将JavaFX Balls装到JavaFX Mobile中,结果很恐怖而且在beta仿真器中极不稳定。另外的问题是:我必须改变VK_STAR to VK_ASTERISK;尽管代码仍旧被编译,但之前的代码不再与仿真器的‘*’按钮所匹配。

Sun的官网公布了JavaFX Mobile的一些支持伙伴,在手持设备方面,仅有LG和SonyEricsson,我希望有更多的这方面的合作伙伴。我的下一个手机将会安装最新最好的Java,包括JavaFX Mobile。

不好的一点是mobile runtime目前并不是在所有现有的设备上都能够安装后就可用,也许不久后这个问题就可以解决。Danny说“你将在JavaOne 2009上看到更多JavaFX Mobile可以运行的手持设备,年底的时候还会有更多的手机。”(译/王玉磊)

Sun推出中高端手机用JavaFX软件

2009年02月12日,星期四

北京时间2月12日下午消息,据国外媒体报道,Sun周四表示已经开始出货手机用JavaFX软件。该公司希望以此从日益兴盛的手机软件市场获益。

在过去2年中,受到谷歌和苹果等进军手机市场推动,该市场的焦点已转移到软件开发领域。全球第三大手机制造商LG电子此前已表示,将成为首家推出支持JavaFX手机的厂商。全球排名第四的索尼爱立信也表示,将在大量产品中采用JavaFX。

Sun最初推出的Java是使用最为广泛的手机软件平台,支持不同的操作系统,但Java只支持基本功能,缺乏高级应用,因此对于软件开发人员的吸引力有限。

Sun负责Java市场营销的副总裁艾瑞克·克莱因(Eric Klein)表示:“JavaFX处于Java的顶层,可以让Java更为强大和更易用。”克莱因指出,尽管Java可以在几乎所有手机上使用,但 JavaFX只能运行在中高端手机中,从而使其与领先的操作系统直接竞争。

Sun希望,新开发工具JavaFX更容易使用以及可用于所有手机,而不是仅限于特定的操作系统的优势可以吸引更多的软件开发人员,从而开发出更多有吸引 力的应用程序。手机操作系统的领先者是诺基亚的Symbian操作系统,但去年却被苹果和黑莓厂商RIM等新加入厂商抢占了大量的市场份额。

克莱因表示:“随着操作系统的增加,开发人员需要一个可以在所有操作系统中运行的统一平台。”对于游戏开发等手机软件开发人员而言,操作系统的多元化意味着要为不同的系统开发不同的版本,从而提高了开发成本。(新浪科技)

国际:JavaFX—是Java桌面的新希望么?

2008年12月23日,星期二

Java已经几乎无处不在,无论是在服务器机房里还是在移动手机上你都可以看到它的身影。然而讽刺的是,Java发明之初的目标——桌面领域,却始终没有占据主导地位。虽然Java完全重做GUI 工具包、加速Java代码、发布像WebStart之类的新版本系统之外,但它还是没能够在始创者意图大展宏图的桌面端产生足够的影响.

基于再战桌面领域的想法,Java在一年多以前宣布了JavaFX,现在JavaFX发布了,很值得一看这个融合了很多开发理念的产品,这些理念将成为Java美妙开发的元素.

JavaFX中主要有两个部分:开发环境(development environment)和运行环境(runtime environment),每一个环境都是构建在以前存在于Java系统的元素之上。开发环境有自己的语言——JavaFX Script,但是它仍然编译为Java类文档。运行时间环境仍然构建在Java虚拟机的基础上可以在大部分浏览器上工作,但是在去年加入了许多巨大的改进,与老的Java运行环境相比更具竞争力。

图片11(文字说明为:Netbeans JavaFX开发环境)

下面,通过创建一个简单的程序,让我们来看看JavaFX Script,然后简单迅速地检验一下在JavaFX和Java中展开配置的不同之处:

JavaFX Script最初叫做F3,当初这样命名是为了回应web开发者对Java太结构化、太冗长的抱怨,因为开发者习惯了像JavaScript,、 Python和 Ruby这样简洁的动态语言。JavaFX Script(通常被简单地称为JavaFX),是一个简单的、静态类型语言(statically typed language),但是它可以编译为Java类文档,不仅可以运行在Java虚拟机上,而且在需要的时候可以调用Java库和代码。这个思想是为了给 Java开发者提供一个用户界面语言,它既可以与已经用Java创建的商业逻辑独立开,又不必创建复杂的用于传统桌面领域的Swing应用。相反,他们可 以使用JavaFX Script中的代码配置一个JavaFX UI,尽管这可以用Swing组件来完成,但在声明用户界面时JavaFX Script更具直接性。为了更加形象地看到JavaFX Script,这里有一个图形”Hi From Heise”的JavaFX项目。

package hifromheise;

import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.text.Text;
import javafx.scene.text.Font;

Stage {
title: “Hi”
scene: Scene {
content: Text {
font : Font {
size : 24
}
x: 10
y: 30
content: “Hi From Heise”
}
}
}

图片22(文字说明为:”Hi from Heise” JavaFX 程序运行)

这段代码为一个应用声明了一个Stage。这个Stage包含一个Scene,后者是UI元素呈现的概念空间,Scene的内容是一个Text元 素,通过它设置字体、在stage中的位置以及包含什么文字。最重要的元素是Scene,它为UI的元素创建了空间。Stage是2D图像,控制许多过度 图和动画功能,通常这都需要开发者明确地写出来。

很强大的一个功能是你可以将UI元素的属性捆绑到变量中,让我们通过创建一个能在文本框里反弹的“Hi”来演示。首先,我们需要对Stage添加一个固定的尺寸:

width:250

height:250

这样我们的文字就有了可以反弹的地方了。然后我们需要确定我们文本的y轴位置,在Stage声明之前添加

var ypos=30;

以此确定我们的变量,在变量里我们可以为文本设定y轴位置:“y:30”:

y: bind ypos

如果我们运行这段代码,那么除了窗口变大之外,其他的都没有改变。现在来看动画的代码,输入代码如下:
import javafx.animation.Interpolator;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
and then we add this code at the end;
Timeline {
keyFrames: [
KeyFrame {
time: 0s
values: ypos => 25 tween Interpolator.EASEBOTH },
KeyFrame {
time: 2s
values: ypos => 210 tween Interpolator.EASEBOTH },
]
autoReverse: true
repeatCount: Timeline.INDEFINITE
}.play

这就创建了一个以关键帧(keyframe)来定义的动画,每个关键帧在设置时定义stage的状态。所以在0秒时,ypos是25,在2秒钟时将 是210.“tween Interpolator.EASEBOTH“告诉JavaFX怎样在其他1.99秒中运动。autoreverse属性告诉JavaFX何时返回到最终 的关键帧,然后反向运行关键帧。repeatCount决定动画的演示时间。

最后我们运行这个动画。可以看到文字上上下下平稳地移动,所以用JavaFX做动画是很简单的。

图片33(文字说明:动画”Hi From Heise”JavaFX程序运行;文字顺畅地移动)

在这里提醒各位注意的是,我上文中用的时间表述是“0s”和“2s”,这是因为JavaFX有一个Duration变量类型,它认为时间是数字和时间单元,所以”1ms”是一毫秒。另外一个值得注意的是绑定,它不会绑到UI声明中,而是更加常规的语言机理。比如这段代码:

var x=10;
var y=20;
var z=bind x+y;

变量z的结果必定是x+y,无论x或者y如何变化z都会更新。这只是JavaFX语言诸多特性中的一部分,对交互式开发、动态用户界面更加有效。

所以Sun推出的JavaFX功能强大而且与Java兼容,同时适合构建富互联网应用,这其实也是未来桌面应用开发工具所需要的部分。但是还有一个 重要的问题Sun需要解决:配置。 Java在web上的配置一直被认为是一件很痛苦的事情。Applets的支持不均衡,运行在浏览器上有时会将浏览器 拖得非常慢,而且有时与浏览器不相容。除此之外,由于向后兼容(backwards compatibility),老版本的Java各个独立存在,让人很是莫不着头脑。尽管这些年来Sun做了很多工作来修补而且进步显著,但所有的这些不 良的性能还是导致Java在浏览器端的名声很坏。

Java Web Start就是Sun的修复工作之一,它允许开发者配置桌面Java应用,而且可以通过web自动升级。开发者可以创建一个JNLP文件来web启动他们 的应用,JNLP文件可以被本地的Java获取,然后下载应用的jar文件,创建一个桌面的快捷方式并管理应用的运行。由于JNLP不在浏览器内工作,所 以不会将应用植入到web页面中。

今年初发布的Java 6 Update 10第一次成为模块化的下载,它有一个很小的Java kernel,可以自动下载任何开发者需要的组件。从Java6U10中也可以看到,通过在Java运行时间中补丁升级,Sun正在去除老版本的Java。

通过合并applet和web start,Java 6 Update 10同样修改了配置问题。现在,一个applet不仅能够指向服务器上的原始jar文件,而且还能指向JNLP文件,允许applet在客户端浏览器上保 存和升级。而且升级可以延缓或者作为后台程序运行,从而新型applet能够及时启动,开发者也不再需要等待升级的下载。Applets现在也在浏览器外 运行,所以不再拖慢浏览器的性能。一个小的不惹人注意的JVM现在运行在浏览器内扮演一个小型服务器层,一个单独的JVM实际在运行applet的代码。 浏览器内的进程独立早已成为普遍采用的方法,所以Java不过是在学习浏览器而已。

Sun通过弥补这两个缺陷即:UI代码的复杂性和配置问题,给开发者提供了一个潜能巨大的平台。而且提升了NetBeans 6.5,创建一个编辑器能够支持JavaFX代码,给开发者一个成熟的、基于开源的IDE,同时又能够处理Java代码。
Sun还推出了工具能够将Illustrator和Photoshop的内容转换成JavaFX代码,从而集成优质图形内容变得更加简单.

图片44(文字说明:JavaFX的Production Tools将 Illustrator导成 JavaFX代码)

但也不全是好消息。尽管Sun对开源承诺,但只有编辑器、图形库和工具的部分是在GPL2下许可的。而JavaFX的运行时间是闭源(Closed source),未来会引起很多问题。JavaFX的设计是跨平台的,随着JavaFX 1.0 的发布JavaFX Mobile也出炉,但只有Windows和Mac OS X在发布默认得到支持,尽管这覆盖了大部分的操作系统用户,但是Linux和Solaris仍在苦苦地等待JavaFX的支持。Sun可以辩护他们正在整 合专利编解码以得到媒体支持,并最终可以发布在两个平台上,而不是采用“Windows优先”的态度。

JavaFX能否取代Flash?不可能,因为Flash已经无处不在了,但是JavaFX能够匹敌Adobe的AIR和微软的 Silverlight。Sun能否从JavaFX中得到人们的好印象还尚未可知,但无论如何开发者都会感谢Sun给富应用开发带来的另外一种方法,无论 有没有Swing组件。唯一有一件事情可以确定的是,在富互联网开发方面,现在已经是三足鼎立了。(csdn)

JavaFX技术预览

2008年11月26日,星期三

作者 Charles Humble译者 崔康

Java 的成功可以归结于这样一个事实:它在其所面向的领域里是门非常优秀的通用语言。对于现代企业计算中典型的长时间运行的服务器端编程,以及其它诸如以支持跨 平台、稳定性和安全性为关键的移动开发等方面,Java都是一个不错的选择。但对于一些需要一定程度的专业知识的编程任务,Java和所有通用语言一样不 是非常合适。比方说挑战技术和管理的现代GUI设计。

从 管理角度来看,一个流畅、复杂的用户界面通常需要一些不同的角色——图像艺术家、信息架构师、动画设计人员和程序员。虽然某些人可以担当起所有的职责,但 这类人绝对是少数。通常来说,整个开发过程需要不同的工作人员的参与,设计人员和开发人员之间资源的来回流动常常是个大问题。技术方面,现代UI设计需要 高层次的技术知识。类似Swing这样的复杂工具包,它为开发人员提供了一套复杂的控件,但在创建UI时,开发人员需要花很多时间去学习其使用方法。此 外,界面的响应能力在很大程度上依赖于并发性。这本身不是什么问题——Java多线程编程很简单——但随之带来的是大量的管理转换和动画的固定代码。

Sun 凭借JavaFX介入富互联网应用领域,向Adobe的Flex和 Microsoft的Silverlight宣战。JavaFX无疑是Sun为Java开发人员解决相关问题的策略之一。它的目标在于为创建横跨桌面、互 联网和移动设备的富互联网应用提供一个基础平台,这也可以看出Sun的Java系列产品的一个重大转变,它不再仅仅专注于底层技术,而是开始创建完整的解 决方案。目前的技术预览版包括两个主要组件:关注于设计人员/开发人员工作流的Nile项目和JavaFX Script——一个编写Java GUI应用的新型说明性语言(declarative language)。

Flex和Silverlight都选用XML作为自己的 说明性语言(分别使用MXML和XAML),而 Sun却选择重新开发一门新的脚本语言——JavaFX Script。Sun高级工程师Joshua Marinacci告诉我们,Sun不打算添加对XML语言支持:

“我们发现很多开发人员非常讨厌XML,他们想要的是一个为图形界面优化过的更为简洁的说明性语法。我们相信熟悉JavaScript的开发人员会发现JavaFX Script非常好用。”

JavaFX Script是一个说明性的、静态类型的、编译的、领域特定语言(DSL),它建立在Java标准版和缩微版的基础上,使用来自JavaFX环境的Java包来创建用户界面。它主要针对两类用户组:

  1. 已经熟悉Swing但仍在寻找一种更快更有效的方式来创建富功能界面的Java开发人员。
  2. 熟悉其它脚本语言例如JavaScript或ActionScript的Web开发人员。

JavaFX Script的开发效率很高,拥有一些非常方便的用于插入和删除操作的功能(比如,insert 10 before x[1];)。它还解决了其它很多常见问题,例如,它可以轻松地把UI组件绑定到后台数据库;它通过一个简化的类似监听者的机制(称为事件触发器)在变量 值改变时触发相应的事件。

Sun在语言的可读性上苦下工夫,使它易于掌握,容易读懂。但这样做的一个结果是,他们在 Java和JavaScript中使用了类似BASIC的布尔操作符而不是C风格的操作符。所以,JavaFX Script用“and”替代&&,用“or”替代||。另外,它能够同时支持“not”和“!”。适应这样的用法不需要很多时间,但我 的确发现很多客户都对此感到很惊讶。

JavaFX Script还有其它一些方面也很让人吃惊。比方说,它虽然支持使用保留字来创建函数或者变量,但它却要求用法式引号消除原意——例如,ar <<while>> = 100——而非通过情境分析来判断。再比方说,JavaFX Script选择支持多继承而不采用Java的接口方式。Marinacci解释说:

“GUI环境下,我们发现使用多继承可以简化很多任务。大多数情况下,开发人员没必要用到创建子类,所以这不是什么大问题。子类的应用主要集中在组件开发上。”

JavaFX 借鉴并增强了一些源自的Java的思想。值得一提的是JavaFXDoc在Javadoc的基础上对文档工具做了必要的更新。JavaFXDoc放弃了 HTML,选择生成XML格式文档,随后转换成其它输出格式。目前的格式是XHTML1.0。这种两步走的策略为将来支持其它格式例如PDF或者建立存储 知识的数据库的可能性保留了实现的余地。新的输出格式不使用frame,可以很容易地通过CSS对其格式化。它同时还可以对各个profile做基本的过 滤——例如,JavaFX API被分为通用、桌面和移动profile,可以正确过滤文档。这里有一个例子。另一个能够体现高效开发的功能是JavaFXDoc通过@examples标识生成内部示例。示例代码自动根据语法高亮显示,然后文档工具编译和执行示例把结果截屏贴到文档中,提供了一种自动更新文档截屏的方法。

我 们与Marinacci还谈到了这项工具的未来开发计划,他证实Sun正在开发一个搜索解决方案,但1.0版不会提供。对核心Javadoc工具的更新目 前暂定在Java 7发布,他相信Javadoc未来版本的开发会吸取JavaFXDoc带来的经验教训。JavaFX Script可以访问所有现存Java包,它本身也包含了一些新的API。其中两个关键API是媒体 API(目前提供的是原生库版本,在1.0版中将以On2 TrueMotion video codecs取 而代之)和场景图形API。场景图形API体现出具有Swing技术背景的开发人员通常思考GUI的方式的转变。这里GUI代表了一系列层次的可视化节 点,这些节点组成场景并与用户交互。场景图像模型支持效果、任意变换(缩放和旋转)和动画。场景图形保留图形对象,每当页面刷新时都会重画图形,这就隐藏 了处理重画的细节、缓存和其它类似于Java2D那样的即时性API问题。这种层次的抽象也允许API进行各种优化,例如预加载纹理和图形卡的原型。场景 图形API与JavaFX紧密关联,但你也可以在普通Java程序中应用。

Sun把API分成3种profile,目前可以用的有 两种:通用profile API在所有设备上都可用,包括场景图形API和媒体组件,而桌面profile则更类似于Swing组件。第三种是移动profile,预计在2009 年发布,对移动设备开发人员可能是一个完整的应用栈,不过目前没有详细的公开的信息。

截至到撰写本文时,通用API尚且存在一两个重大的遗漏——例如,JavaFX预览版中没有和Table、TabbedPane、TextArea或BookPanel相同的对象。1.0版应该会更为完整些。 Marinacci告诉我们:

“我们计划把Swing组件移植到子类节点,然后就可以自由地把Swing组件和图形节点混合在一起,不需要再使用适配器类。目前,高级类(例如树和表格)只在桌面系统上可用。”

开 发一个新的语言而不是听从Adobe的领导是一个大胆的尝试,我觉得这个很好的决策。JavaFX Script很好用,而且除了目前的应用外还有其它一些可能的用途——例如,JavaFX数据格式(FXD),这是Nile项目的一个关键部分,采用 JavaFX Script说明性格式的一个子集来表示图形资源。

Microsoft为Silverlight提供了特别的工具箱 (Expression工具包),直接转换Adobe的 Creative Suite的输出文件。Sun也正在开发自己的工具(预计明年),他们决定通过Nile项目来支持目前流行的一些工具,这些工具中首当其冲的是Adobe 的Illustrator和Photoshop。

Nile项目支持OS X和Windows,它包含特别针对Adobe Illustrator和Photoshop CS3的插件、一个SVG转换工具以及JavaFX数据格式(FXD)查看器。使用Adobe工具的设计者可以像往常一样创建图形资源,最后以FXD的格 式输出。用户可以通过查看器来浏览图形文件,以确认输出的文件如期望的一样。开发人员还可以通过JavaFX脚本语言来访问和处理组成图形资源文件的各个 图层。这些操作对于图形资源的处理表现地很好,但定制样式到基本组件却仍然是个问题。Sun目前正在研究如何利用CSS包装Swing组件,这是 JavaFX 1.0版中计划实现的目标之一。

所有这些工作都在Java 6 Update 10(正式名称为消费者JRE项目)的基础上完成——对部署、性能、内存使用和内建的感观(Nimbus)的改善更有助于推动Swing高效地开发桌面应 用。可惜的是,目前对开发人员来说,这些改善仍然很有限。尽管Sun公司已经发布了update 10的Windows、Linux和Solaris版本,但这几个版本在applet quickstarter、内核安装文件和Direct3D pipeline(仅限于Windows平台)方面的实现方式完全不同。此外,苹果公司在所有64-bit Intel Mac的OSX 10.5上对Java 6都有所限制。 Marinacci也向我们证实了Sun正在与苹果合作改善Java和JavaFX对OSX的支持的消息,但没有透露任何细节。同时,他还向我们提供了最 新的下载统计数据:

“JRE每月平均有4000-5000万次的下载,有些月份会达到1亿。这些下载95%是 JavaSE 6。在JavaSE 6 update 10正式发布数月之后,它会开启自动更新,我们期望能够看到类似的数据。根据Omniture的统计,连接到因特网的计算机有91%都安装了Java。”

Flash 和Silverlight都是完全封闭代码的专有工具,对于某些开发人员来说在使用上是一个巨大的障碍。由于Flash中的很多关键代码例如音频和视频解 码器都由第三方授权使用,Adode因此很难像Sun开放Java那样轻松地开放Flash平台。虽然license还没有最后敲定,但Sun正在努力把 JavaFX作为开源软件发布,目前他们已经在GPL v.2 license下发布了编译器和场景图形API。开源也许能够显著提高JavaFX平台的普及率,然而,若想成为有力的竞争者,JavaFX还有很多重要 的工作要做。

查看英文原文:Java FX Technology Preview