JavaFX发现之旅:JavaFX Script With Eclipse 入门(第一部分)

pytruth1002 发表于 2007-06-01 17:07:13
作者:feiy     来源:feiy
评论数:22 点击数:6,070     投票总得分:5 投票总人次:1
关键字:JavaFX

摘要:

最近Java社区最火的就是JavaFX Script的发布了,并且Sun同时公布了JavaFX Script的开源网站:openJfx,JavaFX Script是Sun的RIA解决方案,是一种用于编写能够在支持Java的PC和手机上运行的应用软件的更简单的脚本语言。
最近Java社区最火的就是JavaFX Script的发布了,并且Sun同时公布了JavaFX Script的开源网站:openJfx,JavaFX Script是Sun的RIA解决方案,是一种用于编写能够在支持Java的PC和手机上运行的应用软件的更简单的脚本语言。其编写的程序可以直接在Java虚拟机上运行(Java 1.5以上),从其运行的环境、方式看,这是Adobe Apollo的劲敌,其运行的效果大家可以查看官方的演示程序(注意,需要Jre 1.5),效果很惊人的哦。下面是其中一个演示的效果图:

image

从语法来看,JavaFX Script是个Java和VRML的混合体,既有Java的优点(面向对象,继承等等),又有VRML的优点(图形描述)。在IDE支持方面,目前以及推出NetBeans和Eclipse的插件,虽然功能还不是很强大,但相信等JavaFX Script正式发布的时候,IDE方面的支持会持续加强的,比如可视模式的UI编辑、语法提示等。

OpenJfx官方有一个基于NetBeans的JavaFX Script 起步,考虑到Flex开发中eclipse(FlexBuilder)的使用情况,今天我们将基于Eclipe来一起开始我们的JavaFX Script发现之旅。文中除了将原文的使用NetBeans更改为Eclipse,其他均翻译自官方文档。

要完成我们今天的旅途,您首先需要安装Eclipse 3.2.2,以及安装FlexBuilder也可以,另外如果您的Jre版本低于1.5请升级。

安装JavaFX Script For Eclipse插件

首先我们来安装JavaFX Script For Eclipse插件,官方的安装说明在这里,安装步骤如下:

启动Eclipse/FlexBuilder;
从主菜单选择 Help > Software Updates > Find and Install;
在Install/Update对话框中, 选择Search for New Features to Install然后点击Next;
点击New Remote Site;
在New Update Site对话框中,在Name中输入JavaFX;
在URL中输入:http://download.java.net/general/openjfx/plugins/eclipse/site.xml
点击OK;
在Install窗口中点击Finish;
在Updates对话框中选择JavaFX > JavaFX node > 然后点击Next;
接受协议并点击Next;
点击Next和Finish;
在Verification对话框中选择Install All;
安装完成后重启Eclipse,JavaFX Script Eclipse 插件就安装完成了。

新建JavaFX工程

以上准备好了JavaFX Script的Eclipse开发环境,现在我们来实际开始JavaFX Script之旅。

我们需要创建一个Java工程来存放我们的JavaFX Script文件。

从Eclipse的主菜单选择New > Project
在选择工程向导窗口中选择Java Project

image

点击Next
输入Project Name为:JavaFXapp
不需要添加JavaFX Script Lib,运行JavaFX Script程序时,Eclipse会自动添加并设置环境的。点击Finish,完成。

image

现在JavaFXapp工程就创建好了,如下图:

image

创建我们第一个JavaFX程序

现在,开始用Eclipse创建我们第一个JavaFX HelloWorld 程序。

右击JavaFXapp > New > Other

image

在New窗口中选择JavaFX > JavaFX File,

image

点击Next,在File name输入:HelloWorld.fx,


image

点击Finish,HelloWorld.fx就被添加到JavaFXapp工程中,并且在右边自动被打开了。


image

将下面代码粘贴到HelloWorld.fx中:

import javafx.ui.*;
        
Frame {
  title: "Hello World JavaFX"
  width: 200
  height: 50
  content: Label {
     text: "Hello World"
  }
  visible: true
}
运行我们的第一个JavaFX程序

现在让我们用Eclipse运行我们的第一个JavaFX程序。
在Eclipse主菜单,选择Run > Run...:
image

在Run窗口中,双击JavaFX Application:
image

然后在Name输入:HelloWorld:
image

点击Arguments,在Program arguments中输入我们的JavaFX程序名称:HelloWorld,这里的名称与Java类名一致,如果我们的HelloWorld存放在prac目录下,那们就输入prac.HelloWorld:
image

点击Run,自动编译运行,将出现下面运行窗口:
image

恭喜,我们现在完成了第一个JavaFX程序。

语法解释

正如您在前面章节看到的,JavaFX语言提供了一种用于表述用户界面组件结构和内容的声明式的语法(Declarative Syntax)。为了帮助您理解发生了什么,我们使用类似于Swing的纯程序的形式(类似AS3)重写以上代码:

var win = new Frame();
win.title = "Hello World JavaFX";
win.width = 200;
var label = new Label();
label.text = "Hello World";
win.content = label;
win.visible = true;

以上源代码同样是正确的JavaFX程序并且和前面的运行效果相同。

以下同时说明了以上声明式和程序式方式的代码实际发生了什么:

调用Frame类构造器创建一个新的Frame。
对Frame的title、width、visible和content属性进行赋值。
在content属性的赋值过程中,调用Label类构造器创建了一个新的Label,并且给它的text属性赋了一个值。
但是,即使像这里这么极端简单的示例中,描述性语法编写的程序的意识还是更加容易理解。

因为声明式编程(declarative programming)可以从单个表达式创建程序,如前面第一个例子,表达式的根一般为一个生成程序的对象图形的对象分配表达式(构造器)。
添加动态行为(dynamic behavior)

上面的“Hello World”程序没有动态行为。在JavaFX中创建一个带动态行为的图形用户接口,即创建一个属性依赖其他对象属性值的图形用户接口组件(和Flex中的绑定的概念一致)。这些其他对象可以是任何您觉得合适的代表您的应用状态的对象。因为该GUI组件的属性依赖于另一个对象,它会自动反应任何时候您对另一个对象的修改。相应的,GUI组件是视图(View)而另一个对象就是模型(Model),下面是“Hello World”程序的Model/View版本:

import javafx.ui.*;

class HelloWorldModel {
  attribute saying: String;
}

var model = HelloWorldModel {
  saying: "Hello World"
};

var win = Frame {
  title: "Hello World JavaFX"
  width: 200
  height: 50                
  content: Label {
    text: bind model.saying
  }
  visible: true
};


运行程序显示如下:
image

如果model对象的saying改成下面这样:

model.saying = "Goodbye Cruel World!";


运行结果将变为下图所示:
image

注意该示例通过JavaFX的bind操作将label的text属性初始化为mode的saying属性。在这里,bind操作声明增量更新。这意味着任何时候model.saying改变,label的text属性都将更新为相同的值。

对于输入构件,如按钮、复选框和文本输入域,模式属性和GUI组件之间的连接可以是双向的。

考虑以下示例:

import javafx.ui.*;

class HelloWorldModel {
  attribute saying: String;
}

var model = HelloWorldModel {
  saying: "Hello World"
};

var win = Frame {
  title: bind "{model.saying} JavaFX"
  width: 200
  height: 50
  content: TextField {
  value: bind model.saying
}
  visible: true
};


运行该程序,显示如下:
image

如果您在文本输入域中输入其他内容然后敲回车,窗口的标题将相应的改变:
image

在这一情况下,文本域的值的更新是用户输入的结果(通过TextField类的实现)。当model的saying属性更新到与文本域相同值发生时,因为该表达式指定窗口的title属性依赖于model的saying属性,表达式被重新计算并且窗口的title属性更新到上面的结果。但是,这样的内容表达依然是声明。

本页页面地址:

投票评分(记入本贴作者的专家分)

     非常好 还行 一般 扔鸡蛋          投票总得分: / 投票总人次:

用户评论列表

#1 评论作者: studyit 发表时间: 2007-06-05 01:39 下午

看上面的例子,是很简单,但是语法上与js有很多不同了。。。做ria的一般是ui的人多,而且他们使用js也是最多的,这样js转变为fx就有较多的学习过程了,同时也不可能让原来开发java的人来做ui阿。。。。
因此,jx应该要考虑到js的迁移问题。
我对jx不了解,看了上面的例子就说说自己的看法,请大家指教

#2 评论作者: cleverpig 发表时间: 2007-06-05 08:33 下午

不错的入门文章,只是需要在美化一些文字。

#3 评论作者: soleegn 发表时间: 2007-06-06 08:42 上午

貌似简化了原来的UI层的开发了?那么IDE的支持怎么样?用新语法包装以后,是不是还要在一定程度上翻译成原有的代码?速度会不会降低?
如果只是用新语法包装了,那我还不如用老语法开发UI呢,IDE的支持还没有问题!

#4 评论作者: fzlqq 发表时间: 2007-06-06 09:05 上午

要是做ui还不如wxpython,比这个方便多了

#5 评论作者: 5452 发表时间: 2007-06-07 04:05 下午

not found: src/Hello.fx
compile thread: Thread[AWT-EventQueue-0,6,main]
compile 0.0
init: 0.094
试了一下,就出现这个错误,jdk6.0+eclipse3.2.2,目录结构是没错的

#6 评论作者: boboppie 发表时间: 2007-06-07 04:50 下午

这个fx不是说是网络的开发替代js的吗?怎么从这篇文章看不出来呢?

继续学习中!作者在Ubuntu下开发,赞!

#7 评论作者: boboppie 发表时间: 2007-06-07 04:50 下午

这个fx不是说是网络的开发替代js的吗?怎么从这篇文章看不出来呢?

继续学习中!作者在Ubuntu下开发,赞!

#8 评论作者: boboppie 发表时间: 2007-06-07 04:59 下午

JavaFX 脚本式语言特别适用于Java2D swing GUI组件,它允许简单地创建图形界面

#9 评论作者: joyce004 发表时间: 2007-06-11 10:58 上午

与flex很像,不过问题是javafx出来的用意是什么,主要用在哪个方面??

#10 评论作者: cyz99 发表时间: 2007-06-15 06:59 下午

运行的时候感觉速度好慢!

#11 评论作者: mreay 发表时间: 2007-06-15 07:59 下午

观望中,近日只是在了解Flex并且现在3.0已经出来了,新特性比较多!javaFX要加油了,估计在表现方面sun要比Adob差的多,毕竟这不是sun的强项!而RIA重点就是表现出来的用户体验!

#12 评论作者: nbjd 发表时间: 2007-06-16 09:54 上午

JAVAFX学习中,看了实例后有点知道了,谢谢!

#13 评论作者: kiddkaka 发表时间: 2007-06-23 07:43 下午

正准备学Flex,现在又出来个javafx。
学哪个好呢?

#14 评论作者: aweto_sy 发表时间: 2007-07-05 01:14 下午

这是什么东西啊。都没听说过。哎!

#15 评论作者: 来看看 发表时间: 2007-07-08 10:30 上午

谢谢楼主了。。。。。

#16 评论作者: kujioon 发表时间: 2007-07-25 03:22 下午

看来要学的东西还很多啊,总是跟不上脚步

#17 评论作者: dh2005 发表时间: 2007-09-05 11:08 下午

关注中
嘟土豆  -  做Google,百度,Yahoo的网站正常收录

#18 评论作者: diggywang 发表时间: 2007-09-11 10:41 上午

为什么我在程序中bind的增量更新没有出来呢?

#19 评论作者: 0obeiiedo0 发表时间: 2007-09-11 04:59 下午

感谢,阁下的helloWorld

#20 评论作者: mreay 发表时间: 2007-09-12 02:39 下午

尽快有IDE的支持才是正途!

#21 评论作者: bbsmms 发表时间: 2008-06-05 10:59 上午

我也想培训JAVA,有人去过JAVA私塾吗?我一同学在那里学习,她推荐我去的。


发表我的评论 (评论可增加个人积分...)

用户*: E-mail:
评论内容*:

支持BBCode
算术题*: + =