`
txf2004
  • 浏览: 7042342 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

学习JavaFX Script,第一部分:针对Java程序员的JavaFX介绍

阅读更多

原文地址:http://java.sun.com/developer/technicalArticles/scripting/javafxpart1/

JavaFX Script编程语言(以下称为JavaFX)有Sun微系统公司开发的一种declarative, statically typed(声明性的、静态类型)脚本语言。如Open JavaFX(OpenJFX)网站所述,JavaFX技术有着良好的前景,包括可以直接调用Java API的能力。因为JavaFX Script是静态类型,它同样具有结构化代码、重用性和封装性,如包、类、继承和单独编译和发布单元,这些特性使得使用Java技术创建和管理大型程序变为可能。
这一系列的JavaFX入门文章包括三部分。第一部分是JavaFX编程语言的介绍,目标读者是那些熟悉Java技术并且具有脚本语言基础的开发者。第二和第三部分演示如何使用JavaFX连接使用Remote Method Invocation(RMI)Java API for XML Web Services(JAX-WS)技术的远程服务器

JavaFX Pad应用程


如果在你的系统上已经安装了JRE,最简单的入门方式就是打开Java Web Start激活演示程序——JavaFX Pad。一旦运行这个该程序,应该可以看到类似图1所示的界面:
JavaFX Pad界面
图1 运行在Windows Vista,JDK6上的JavaFX Pad
JavaFX Pad启动时加载并执行一个默认的程序。不过,你也可以从本文的例子中复制代码,粘贴到源码去,然后观察变化。另外,你也可以将代码保存到本地,并从本地加载JavaFX源文件。JavaFX Pad可以实时的查看在运行时你做了什么,做了改变,立即可以看到结果。

JavaFX技术:一种Statically Typed语言
JavaFX编程语言是一中有着static typing特性的脚本语言。具体怎么理解呢?来看下面的例子:
varmyVariable="Hello";
这种变量的声明方式很类似于JavaScript技术中的变量生命方式,创建一个名称为myVariable的变量,并将其赋值为一个字符串“Hello”。然而,在声明之后我们重新给它赋值:
myVavriable=12345;
因为在12345两端没有引号,所以这个变量的值现在被改为了整数。在JavaScript中,是允许动态改变类型的。而静态类型语言如JavaFX是不允许这样做的。这是因为myVariable已经被初始化为了String类型,而后面的代码却尝试重新赋给它一个整数类型的值。在JavaFX中,一个变量被声明为了String类型,就一直保持String类型。
其实,如果把上面的两行代码输入到JavaFX Pad的demo中,立即就会在窗口的下方看到错误提示,如图2:
JavaFX中静态类型不能改变其类型
图2JavaFX中静态类型变量不能其改变类型

JavaFX技术:一个Declarative脚本语言

JavaFX技术也是一种declarative脚本语言。这里的declarative是什么意思呢?为了回答这个问题,来看OpenJFX网站上的Hello World程序:
classHelloWorldModel...{
attributesaying:String;
}


varmodel
=HelloWorldModel...{
saying:
"HelloWorld"
}
;

varwin
=Frame...{
title:bind
"{model.saying}JavaFX"
width:
200
content:TextField
...{
value:bindmodel.saying
}

visible:
true
}

多数编译性语言,包括Java,被认为是命令式编程语言(imperative programming language)。其中,它们依赖于一个程序的入口,如Java中的main()方法。它们通过这个入口点实例化其他类或字段,或设置基于变量或程序状态的资源。为了稍微扩展一下这个例子,你也可以说命令式编程语言,在运行时“公式化”地决定其运行的途径。尽管这个公式可能导致每次运行都是同样的途径,但是这种语言仍旧在运行决定其运行途径。
注意,上面JavaFX的Hello World程序并没有包含main()方法。脚本引擎在执行之前读入整个程序,然后让解释器执行其所需要的任何步骤以正确运行程序。更准确地说,引擎需要的所有东西都要在执行之前声明,然后引擎通过声明决定做什么以达到预期目标。

在JavaFX Pad中使用System.out.prinltn()


接下来我们将要看到的是,JavaFX调用传统Java类库的能力。然而,在你希望在JavaFX Pad程序中使用System.out.println()之前,需要打开控制台支持,操作如下:
1、Microsoft Windows XP或者Vista,点击控制面板中的Java图标,选择高级选项卡,从Java控制台下的条目中选择“显示控制台”。
2、Solaris操作系统,点击参数(Preferences)选项卡中的Java图标,选择高级选项卡,从Java控制台下的条目中选择“显示控制台”。如果在参数选项卡中没有Java图标,运行bin目录下的控制面板程序(或jcontrol)。
3、Linux操作系统,在bin目录中查找控制面板(或jcontrol)程序,运行,点击参数选项卡中的Java图标,选择高级选项卡,然后从Java控制台下的条目中选择“显示控制台”。
4、Mac OS X操作系统,打开/Application/Utilities/Java/[Java version]/下的Preferences程序。选择高级选项卡,然后从Java控制台下的条目中选择“显示控制台”。注意:如果在Java Preferences更改后Java Web Start在Intel Mac上启动错误,尝试打开home目录下的Library/Caches/Java/deployment.properties文件,然后将所有的osarch的值由i386改为ppc.
在JavaFX Pad中,取消对Run菜单下的Run Automatically的选择,在手动运行JavaFX程序前清空Java控制台。使用JavaFX Pad中的Run菜单下的Run菜单项可以手动运行程序。
图3是JavaFX Pad及控制台运行在Intel-based Macintosh上。图4是JavaFX Pad运行在OpenSolaris上。
运行在Mac OS X上的JavaFX Pad及控制台,JDK1.5.0_07
图3 运行在Mac OS X上的JavaFX Pad和Java控制台,JDK1.5.0_07
运行在OpenSolaris上的JavaFX Pad及Java控制台,JDK6
图4 运行在OpenSolaris上的JavaFX Pad及Java控制台,JDK6

最后,如果你正要将变量嵌入到JavaFX的字符串中,这在Java中使用System.out.println()方法时非常普通的操作,注意在JavaFX中的正确语法是:
importjava.lang.System;

System.out.println(
"Text{variable}andmoretext");

与Java语法不同:

importjava.lang.System;

System.out.println(
"Text"+variable+"andmoretext");

开始了解JavaFX技术


这一部分讨论JavaFX的基础知识。其中的大部分内容直接来自于官方的JavaFX编程语言参考文档(JavaFX Programming Language Reference),本文作者针对Java编程人员做了一些修改。

原始类型

JavaFX仅支持四种原始类型:String,Boolean,Number和Integer。注意,和Java不一样,JavaFX的原始类型首字母大些。表1列出了JavaFX解释器内的原始类型及与之对应的Java对象。
表1:JavaFX的原始类型及其和Java的对应关系
JavaFX原始类型 相应的Java原始类型或类
String java.lang.String
Boolean java.lang.Boolean
Number java.lang.Number
Integer

byte,short,int,long,
java.math.BigInteger









注意:简便期间,Integer表示小数字和大数字,而Java中可能会使用不同的原始类型如short和long。浮点数,如Java中的float和double,全部有Number类型替代。
由于Java对象代表了这些原始类型,因此你可以调用Java中已存在的这些类型的方法。
vars:String="Hello";
s.toUpperCase();
//Stringmethodthatyields"HELLO"
s.substring(1);//Stringmethodthatyields"ello"

varn:Number=1.5;
n.intValue();
//Numbermethodthatyieldsinteger1
(1.5).intValue();//Numbermethodthatyieldsinteger1

varb:Boolean=true;
b
instanceofBoolean;//Booleanmethodthatyieldstrue
如果你想看到这些表达式的结果,就把它们放到System.out.println()语句中,并且确保在顶端导入了java.lang.System。同样,如果得到了一个incompatible type的错误,就在这段脚本的结束位置加入一个返回null的语句。如下:
importjava.lang.System;

vars:String="Hello";
System.out.println(s.toUpperCase());
//Stringmethodthatyields"HELLO"
System.out.println(s.substring(1));//Stringmethodthatyields"ello"

varn:Number=1.5;
System.out.println(n.intValue());
//Numbermethodthatyieldsinteger1
System.out.println((1.5).intValue());//Numbermethodthatyieldsinteger1

varb:Boolean=true;
System.out.println(b
instanceofBoolean);//Booleanmethodthatyieldstrue

returnnull;//FinalnodereturnedforJavaFXPaddisplay
此外,注意关键字var的使用:尽管在Java中没有使用,但是在JavaFX和其他脚本语言中被用来声明一个新的变量。因为JavaFX是静态类型语言,所以在可以声明变量时指定其类型,或者JavaFX解释器通过变量的使用来推断其类型。例如,下面三种形式在JavaFX中都是合法的:
vars:String;
vars:String="ANewString";
vars="ANewString";
第一和第二种声明正是地为变量赋予String类型,然而第三种就是通过等号(=)右边的初始化推断其为String类型。将其更加形式化,JavaFX的变量声明可以使用下面的方式表示:
varvariableName[:typeName][?|+|*][=initializer];
问号、加号和星号称为基数操作符。如果使用过表达式语言,对它们一定不陌生。可以使用它们中的一个表示变量的基数(成员的数量),如表2所示。
表2:JavaFX基数操作符
操作符 意义
? 可选(可以为空)
+ 一个或多个
* 0个或多个

下面是一个例子:
varnums:Number*=[5,9,13];
这个例子声明了一个名为nums的变量,其值被定义为由0个或多个Number类型的实例组成, 初始化值是三个数字:5,9和13。
typeName、基数操作扶和初始化部分都是可选的,因此下面的声明和前一个例子等价:
varnums=[5,9,13];

字面量(Literals)

在JavaFX中,字面量字符串由单引号或者双引号指定:
vars='Hello';
vars="Hello";
如作者前面所提,变量甚至整个JavaFX表达式都可以使用花括号({})包括的嵌入形式:
varname='Joe';
vars="Hello{name}";//s='HelloJoe'
嵌入表达式可能自己又包含引用的字符串,它又包含嵌入表达式:
varanswer=true;
vars="Theansweris{ifanswerthen"Yes"else"No"}";
//s='TheanswerisYes'
最后,不像Java,双引号中的String字面量可以包含多行:
vars="This
contains
newlines
";

数组和列表(Array and List Comprehensions)

在前面你可能就已经注意到基数操作符可以创建数组。JavaFX中的数组由方括号和逗号标示。和Java一样,JavaFX数组中的所有元素必须为同一类型。
varweekdays=["Mon","Tue","Wed","Thur","Fri"];
vardays=[weekdays,["Sat","Sun"]];
数组代表了对象序列。在JavaFX中,arrays are not themselves objects。另外,声明嵌套数组(如前面的例子中第二个变量days的初始化)的表达式会自动填充。
days==["Mon","Tue","Wed","Thur","Fri","Sat","Sun"];
//returnstrue
注意,如果执行System.out.println(days),就只会看到数组的第一个元素。使用数组索引可以获得数组元素。同样,如果指定一个并不存在的索引,就会得到ArrayIndexOutOfBoundsException,和Java一样,但是在JavaFX中是0.
可以使用sizeof操作符获得当前数组的大小:
varn=sizeofdays;//n=7
还有一种使用两点(..)的简便形式,其表示数组的元素组成一个算术系列。例如,下面代码创建一个100个元素的数组:
varoneToAHundred=[1..100];
vararraySize=sizeofoneToAHundred;//size==100
JavaFX同样支持insert和delete语句对数组进行操作。下面是把值插入(into)到数组中的例子:
varx=[1,2,3];
insert
12intox;//yields[1,2,3,12]
insert10asfirstintox;//yields[10,1,2,3,12]
insert[99,100]aslastintox;//yields[10,1,2,3,12,99,100]
除into以外,还可以使用before和after关键字,如下:
varx=[1,2,3];
insert
10afterx[.==3];//yields[1,2,3,10]
insert12beforex[1];//yields[1,12,2,3,10]
insert13afterx[.==2];//yields[1,12,2,13,3,10];
一些表达式方括号中的看起来并不成对,不用担心。它们其实是Xquery-Update(类似XPath)谓词。在这种情况下,方括号中的部分不是引用索引而是索引的值。JavaFX会测试数组中的每一个元素直到表达式结果为true,然后应用insert。例如,最后一个语句迭代数组中的每一个值,当找到一个元素的值为2时就在该值后面插入数字13,该值是数组的第三个元素。表达式也会在这一点停下来。
delete语句以同样的方式工作。注意,如果方括号中的表达式被省略,将会删除整个数组。
varx=[1,2,3];
insert
10intox;//yields[1,2,3,10]
insert12beforex[1];//yields[1,12,2,3,10]
deletex[.==12];//yields[1,2,3,10]
deletex[.>=3];//yields[1,2]
insert5afterx[.==1];//yields[1,5,2];
insert13asfirstintox;//yields[13,1,5,2];
deletex;//clearsthearrayandyields[]
最后,使用select和for each操作符进行一些复杂的数组查询操作。这被认为是list comprehensions。下面是一个使用select的简单例子:
vara:Integer*=selectn*nfromnin[1..10];
//yields[1,4,9,16,25,36,49,64,81,100]
有一种简单的表示形式,如“循环[1..10]数组中的每一个数字,将其赋给局部变量n,然后对每一个n创建一个元素n的平方,并将其添加到一个Integer数组a中”。
可以如下所示增加一个过滤器:
vara:Integer*=selectn*nfromnin[1..10]where(n%2==0);
//yields[4,16,36,64,100]
定义做如下改变:“循环[1..10]数组中每一个数字,将其赋给一个局部变量n,但是只有当该数字能被2整除时,换句话说,该数字为偶数时。然后,对于每一个结果n,创建一个新的元素n的平方,并将其添加到一个整形数组a中”。
最后,可以想选择语句中添加多个list:
vara:Integer*=selectn*mfromnin[1..4],min[100,200]where(n%2==0);
//yields[200,400,400,800]
循环嵌套循环十分有效地创建了笛卡尔乘积的形式。从获得第一个合法的n值2开始,乘上第一个合法的m值100.然后是同样的2乘上下一个合法的m值200。然后,使用下一个合法的n值4重新开始在m(100和200)上的迭代,得到400和800。这是,选择结束,就得到了最终的数组,被放置在数组a中。
使用foreach操作符可以达到同样的效果:
vara:Integer*=
foreach(n
in[1..4],min[100,200]where(n%2==0))
n
*m;//alsoyields[200,400,400,800]

格式化(Formatting)


操作符format as支持几种格式化命令,如表3所示:
表3:JavaFX格式化命令
指令 格式化使用的类
以%引导的格式化命令 java.util.Formatter
表达式是Number java.text.DecimalFormat
表达式是java.util.Date java.text.SimpleDateFormat
下面是一些例子:
importjava.util.Date;

100.896formatas<<%f>>;//yields'100.896000'
31.intValue()formatas<<%02X>>;
//yields'1F'
vard=newDate();
dformatas
<<yyyy-MM-dd'T'HH:mm:ss.SSSZ>>;
//yields'2005-10-31T08:04:31.323-0800'
0.00123formatas<<00.###E0>>;
//yields'12.3E-4'
注意,此例中法语引用符号(或者双尖括号<< >>)的使用。JavaFX将双尖括号内的标识符包括空格看作普通的字符序列。这就允许在JavaFX的关键字或者其他通常的非法标识符如class,variable,function或者属性的名称。如下例所示:
var<<while>>=100;
这个特性是JavaFX可以调用Java中与其关键字相同名称的方法,如下面的例子:
importjavax.swing.JTextArea;

vartextArea=newJTextArea();
textArea.
<<insert>>("Hello",0);

声明类(Declaring Classes)

JavaFX声明的一个类型的语法是:class关键字后面是类的名称,可选的extends关键字,使用逗号分隔的基类名称。注意,与Java不同,JavaFX可以继承多个类。再接着是一个开放的花括号({),然后是属性、函数和操作列表,每个都使用分号(;)结尾,最后是一个闭合的花括号(})。下面是一个例子:
classPerson...{

attributename:String;
attributeparent:Person;
attributechildren:Person
*;

functiongetFamilyIncome():Number;
functiongetNumberOfChildren():Number;

http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBl
分享到:
评论

相关推荐

    JavaFX Script 语言教程(面向Swing 程序员).pdf

    JavaFX Script 提供了一系列高级特性,如第一级函数、声明式的语法结构、列表推导以及基于依赖关系的增量式求值,这些都使得GUI应用的开发变得更加高效和直观。 #### 第一级函数与列表推导 JavaFX Script 支持第一...

    JavaFX Script 语言教程(面向Swing 程序员)

    它具有第一级函数(first-class functions)、声明式的语法、列表推导(list-comprehensions)及基于依赖关系的增量式求值(incremental dependency-based evaluation)等特征。JavaFX 脚本式语言特别适用于Java2D ...

    JavaFX Script - Dynamic Java Scripting for Rich Internet-Client-Side Applications

    1. **第一章:JavaFX 入门**(Introduction to JavaFX) - 介绍 JavaFX 的基本概念及其在富客户端应用开发中的作用。 - 解释 JavaFX Script 如何与其他 JavaFX 技术组件协同工作。 2. **第二章:快速入门**...

    Java.FX.in.Action.Edition.November.2009

    - **第1章:欢迎来到未来——介绍JavaFX**:这一章首先介绍了JavaFX的概念,包括为什么需要JavaFX Script以及DSL(领域特定语言)的重要性。接着,书中回顾了云计算的发展趋势,并探讨了桌面Java应用的发展历程及其...

    JavaFXScript编程语言中文教程.pdf

    一旦开发环境准备就绪,你可以开始编写你的第一个JavaFX Script脚本。教程中的例子是一个简单的计算器应用,它展示了如何声明变量(def numOne,def numTwo),定义函数(function add, function subtract等),调用...

    教你21天学通java教程

    1. **第一周**:介绍Java的基本概念、环境搭建、语法基础等内容。 2. **第二周**:深入探讨对象导向编程(OOP)、异常处理、集合框架等核心概念。 3. **第三周**:讲解GUI图形用户界面设计、网络编程、数据库连接等...

    面向Swing 程序员

    它具有第一级函 数(first-class functions)、声明式的语法、列表推导(list-comprehensions)及基于依赖关系 的增量式求值(incremental dependency-based evaluation)等特征。JavaFX 脚本式语言特 别适用于Java...

    Flex-Java通信

    Flex-Java通信是将Adobe Flex技术与Java平台相结合,以构建富网络应用(Rich Internet Applications,简称RIA)的一种技术方案。RIA是互联网应用程序的新形态,它弥补了传统C/S(客户端-服务器)和B/S(浏览器-...

    ireport教程.rar

    iReport是一款强大的开源报表设计工具,它与JavaFX Script结合,使得用户能够创建复杂、美观的JavaServer Pages (JSP) 报表。本教程将深入探讨iReport的功能、使用方法以及在实际项目中的应用。 一、iReport简介 ...

Global site tag (gtag.js) - Google Analytics