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


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组件。唯一有一件事情可以确定的是,在富互联网开发方面,现在已经是三足鼎立了。

相关内容