JavaFX脚本入门

原文地址: http://www.onjava.com/pub/a/onjava/2007/07/27/introduction-to-javafx-script.html

        JavaFX是什么?

        在2007年春季Sun发布了一个新的框架,叫做JavaFX。这只是一个通用性的名字,因为JavaFX有两个主要的组成部分:脚本(Script)和移动(Mobile),并且,将来Sun会开发为它开发更多的部分。
        JavaFX的核心是JavaFX脚本,它是一种声明型的脚本语言。它和Java代码非常不同,但是却与Java类保持了高度的交互性。JavaFX脚本的很多类被设计用来更加容易地实现Swing和Java2D功能。使用JavaFX脚本,你只需要几行简单易懂的代码就可以开发GUI、动画和文字及图像炫酷效果。另外,还可以把Java和HTML代码封装到JavaFX脚本中。
         第二个组成部分,JavaFX移动(JavaFX Mobile),是用来为移动设备开发Java应用的平台。最终它必将成为JavaFX脚本的主要平台,但是现在和本文内容并不相关。

          JavaFX应用程序的一些示例(Some Examples of JavaFX Applications)

           在我们开始学习一门新的语言之前,先看一些JavaFX代码的示例。可以在JavaFX的官方网站上找到一些很好的示例资源。点击JavaFX脚本2D图形指南(JavaFX Script 2D Graphics Tutorial)下载这些示例。在下载完成后,只需双击tutorial.jnlp文件。几秒后,你就应该可以如图1所示的程序(如果没有看到,那么你必须配置Java Web Start支持.jnlp后缀。)
JavaFX脚本入门
           图1   运行tutorial.jnlp指南

        花些时间浏览一下这些示例及其源码。其中有些有趣的效果使用几行JavaFX代码就可以实现。
        如果你仍旧对JavaFX的功能有所怀疑,那就看一下这两个demo:StudioMoto和Tesla Motors网站的部分重建。点击JavaFX Script Studiomoto DemoJavaFX Script Tesla Demo可以下载它们的demo。它们都需要使用Java Web Start来运行,根据系统配置的不同,它们可能自动启动,或者需要手动运行下载.jnlp文件。

         下载和安装JavaFX(Download and Install JavaFX)

          如果你有兴趣学习开发JavaFX应用程序,那么你应该知道至少三种使用JavaFX的工作方式。同样,了解JavaFX应用程序不是基于浏览器的也非常重要。最简单、最快的方式是基于一个称为JavaFXPad的轻量级工具。使用这个工具最大好处是,可以几乎是立即看到在编辑器上做的任何改变的效果。点击JavaFX Script JavaFXPad Demo从Project OpenJFX上下载这个工具。 再次说明,需要使用Java Web Start运行该工具(见图2)。
JavaFX脚本入门        
       图2   运行JavaFXPad编辑器

        使用JavaFX脚本的另外一个方式是使用NetBeans5.5的JavaFX脚本插件或者Eclipse3.2的JavaFX脚本插件(当然,在下载和安装这些插件之前,你必须已经安装了NetBeans 5.5或者Eclipse 3.2)。
        如果你决定使用NetBeans5.5 JavaFX插件开始,那么在Project OpenJFX上的JavaFX for NetBeans指南应该有所帮助。类似地,如果想使用Eclipse的JavaFX插件,就去JavaFX for Eclipse。注意,本文的所有示例都在NetBeans5.5的JavaFX插件上通过了测试,同样应该可以在其他列出的方式中运行。

        使用NetBeans5.5的JavaFX插件测试Hello World应用程序(Testing the Hello World Application with JavaFX Plug-In for NetBeans5.5)

         按照学习新语言的同样方式,我们首先编写一个必不可少的Hello World程序:
         代码表1         
JavaFX脚本入门import javafx.ui.*;
JavaFX脚本入门
import java.lang.System;
JavaFX脚本入门JavaFX脚本入门Frame 
...{
JavaFX脚本入门    centerOnScreen: 
true
JavaFX脚本入门    visible: 
true
JavaFX脚本入门    height: 
50
JavaFX脚本入门    width: 
350
JavaFX脚本入门    title: 
"HelloWorld application..."
JavaFX脚本入门    background: yellow
JavaFX脚本入门JavaFX脚本入门    onClose: operation() 
...{System.exit(0);}
JavaFX脚本入门JavaFX脚本入门    content: Label 
...{
JavaFX脚本入门        text: 
"Hello World"
JavaFX脚本入门        }

JavaFX脚本入门    }
         要在NetBeans5.5中开发和运行这个简单的示例,有以下步骤:
         1、启动NetBeans5.5。
         2、从主菜单中选择File->New Project。
         3、在New Project窗口中,选择General,接着是Java Application(点击Next)。
         4、在New Java Application窗口中,在Project Name文本框中输入“FXExample”。
         5、在同一个窗口中,使用Browse按钮选择项目的存放位置。
         6、取消选择“Set as main project”和“Create main class”复选框(点击Finish)。
         7、右键点击FXExample->Source Packages,然后选择New->File/Folder。
         8、在New File窗口中,选择Other,然后是JavaFX File文件类型(点击Next)。
         9、在New JavaFX File窗口中,File Name输入“HelloWorld”,Folder输入“src”(点击Finish)。
       10、从代码表1中复制代码,粘贴到HelloWorld.fx中。
       11、右键点击一个FXExample项目,选择Properties。
       12、在Project Properties - FXExample中,从Categories面板中选择Run节点。
       13、在Arguments文本框中输入“Hello World”(点击OK)。
       14、右键点击FXExample项目,选择Run Project选项。
        如果一切正常,应该可以看到图3所示的框架:
JavaFX脚本入门
     图3   在NetBeans5.5运行Hello World应用程序

       现在已经有了开发和运行JavaFX程序的软件支持。

       JavaFX语法(JavaFX Syntax)

       在开始JavaFX之前,我们首先看一下语法中的一些亮点(fine points)。如果已经熟悉Java语言的语法,那么JavaFX的大部分语法看起来非常相似,但是其中一些完全不同。

       JavaFX的原始类型(JavaFX Primitive Types)

       JavaFX支持四种原始类型:String(对应java.lang.String)、Boolean(对应java.lang.Boolean)、Number(对应java.lang.Number)和Integer(对应byteshortintlongBigInteger)。

        JavaFX的变量(JavaFX Variables)

        JavaFX的变量使用var关键字声明,如下例所示:       
JavaFX脚本入门var x:Number = 0.9;
JavaFX脚本入门var name:String 
= "John";
JavaFX脚本入门var y:Integer 
= 0;
JavaFX脚本入门var flag:Boolean 
= true;
JavaFX脚本入门
JavaFX脚本入门var numbers:Number 
= [1,2,3,4,5];

          JavaFX操作符(JavaFX Operators)

          在Java中被熟知的操作符&&、||和!,在JavaFX中为:
          Java:&&     JavaFX:and
          Java:||         JavaFX:or
          Java:         JavaFX:not

          JavaFX函数(JavaFX Functions)

          JavaFX支持函数。下面是一个简单的函数示例,包含了参数、变量声明和一个返回语句:
JavaFX脚本入门JavaFX脚本入门function taxes(x) ...{
JavaFX脚本入门    var t:Number 
= (19.0/100.0)*x;
JavaFX脚本入门    
return t;
JavaFX脚本入门    }

         JavaFX if语句(JavaFX if Statement)

        在JavaFX中,可以通过if语句构造条件语句块。在if语句中必须使用花括号。如果else子句是另外一个if语句,可以跳过花括号:
JavaFX脚本入门JavaFX脚本入门if (place_your_condition_here) ...{
JavaFX脚本入门        
//do something
JavaFX脚本入门JavaFX脚本入门
    }
 else if (place_your_condition_here) ...{
JavaFX脚本入门        
//do something
JavaFX脚本入门JavaFX脚本入门
    }
 else ...{
JavaFX脚本入门        
//do something
JavaFX脚本入门
    }

         JavaFX while语句(JavaFX while Statement)

         JavaFX的while语句类似Java的while语句。该语句中要必须包含花括号:
JavaFX脚本入门while (place_your_condition_here)
JavaFX脚本入门JavaFX脚本入门    
...{
JavaFX脚本入门    
//do something
JavaFX脚本入门
    }

         JavaFX for语句(JavaFX for Statement)

          for语句用来在一个区间(区间使用方括号[]和..符号表示)上循环:
JavaFX脚本入门//i will take the values: 0, 1, 2, 3, 4, 5
JavaFX脚本入门
for (i in [0..5])
JavaFX脚本入门JavaFX脚本入门    
...{
JavaFX脚本入门    
//do something with i
JavaFX脚本入门
    }

          JavaFX过程(JavaFX Procedures)

          JavaFX的过程使用operation关键字标识。下面是一个简单的示例:
JavaFX脚本入门JavaFX脚本入门operation startClock() ...{
JavaFX脚本入门JavaFX脚本入门
do...{
JavaFX脚本入门    
while(true)
JavaFX脚本入门JavaFX脚本入门        
...{
JavaFX脚本入门        
if(seconds>=360)
JavaFX脚本入门JavaFX脚本入门    
...{seconds = 0; seconds = [0,6..360] dur 60000 linear;}
JavaFX脚本入门        
if(minutes>=360)
JavaFX脚本入门JavaFX脚本入门    
...{minutes = 0; minutes = [0,6..360] dur 3600000 linear;}
JavaFX脚本入门        
if(hours>=360)
JavaFX脚本入门JavaFX脚本入门    
...{hours = 0; hours = [0,6..360] dur 43200000 linear;}
JavaFX脚本入门        }

JavaFX脚本入门    }

JavaFX脚本入门}

        JavaFX类(JavaFX Classes)

        JavaFX的类使用class关键字标识。JavaFX的类可以继承多个类,使用extends关键字,其后面是逗号分隔的那些基类的名称。在花括号中,可以放置属性、函数和操作,如下例所示:
JavaFX脚本入门JavaFX脚本入门class Order ...{
JavaFX脚本入门    attribute order_nr: String;
JavaFX脚本入门    attribute ordertype: Order inverse Order.products;
JavaFX脚本入门    attribute products: Order
* inverse Order.ordertype;
JavaFX脚本入门    function getOrderNr(): String;
JavaFX脚本入门    operation addOrder(order: Order);
JavaFX脚本入门    }
        注意,属性使用attribute关键字声明,并且函数体和过程体并不在类的内部。它们在类声明的后面定义,接下来就可以看到。
        inverse子句是可选的,它说明了该属性和类的其他属性的双向关系。如此,JavaFX可以自动执行更新(插入<insert>、替换<replace>和删除<delete>)。
        可以在Java.net上找到更加完整的指南

        玩转JavaFX(Playing Around wih JavaFX)

        在这一部分中,我们将会看到一系列示例,涵盖JavaFX各种功能和特性。这些示例的主要目的是使你熟悉JavaFX的代码编写和JavaFX程序的逻辑。第二个目的是使你确信,当你需要使用几行代码开发酷GUI、动画和漂亮的效果时,应该优先考虑JavaFX。所有的例子都将会介绍JavaFX的特定技巧。
        每个例子之前都有一段描述,所有不要期望行注释。只要你亲自运行,所有的这些例子都应该是非常容易理解的,我们开始吧。
        当需要使用System.out.println打印变量/属性的值时,可以替换引号中间的其名称,如代码表2所示
        代码表2
JavaFX脚本入门//expressions within quoted text
JavaFX脚本入门
import java.lang.System;
JavaFX脚本入门var mynumber:Number 
= 10;
JavaFX脚本入门System.out.println(
"Number is: {mynumber}");

        结果是:Number is: 10

         JavaFX支持一个非常有用的功能,即变量基数。这个功能使用接下来的三个操作符实现:
            ?:可选(可能是null)
            +:1或多个
             *:0或多个

          代码表3:

JavaFX脚本入门//cardinality of the variable
JavaFX脚本入门
import java.lang.System;
JavaFX脚本入门var mynumbers:Number
* = [1,2,7];
JavaFX脚本入门System.out.println(
"Numbers are: {mynumbers}");

          结果是:Numbers are: 1 2 7

        JavaFX中,变量声明时没有指定变量的类型。这并不会产生错误,因为JavaFX会根据变量的用法自动判断其类型。
        代码表4:

JavaFX脚本入门//the variable's type is optional
JavaFX脚本入门
import java.lang.System;
JavaFX脚本入门var days 
= ["Monday,","Friday,","Sunday"];
JavaFX脚本入门System.out.println(
"You have to work: {days}");

           结果:You have to work: Monday, Friday, Sunday

           可以使用sizeof操作符获得数组的大小:
           代码表5:

JavaFX脚本入门//getting the size of an array
JavaFX脚本入门
import java.lang.System;
JavaFX脚本入门var lotto 
= [21,30,11,40,5,6];
JavaFX脚本入门System.out.println(
"Array size:{sizeof lotto}");

         结果:Array Size: 6
         要从一个数组中获得其满足条件的子数组,可以使用[]操作符。条件包含在[]中,求值结果为Boolean类型。这很类似于XPath谓词。
         代码表6:

JavaFX脚本入门//using the [] operator - similar to its use in XPath
JavaFX脚本入门
import java.lang.System;
JavaFX脚本入门var mynumbers 
= [1,2,7,3,30,15,14,6,4];
JavaFX脚本入门var numbers 
= mynumbers[n|< 10];
JavaFX脚本入门System.out.println(
"Numbers smaller that 10 are: {numbers}");

        结果:Numbers smaller than 10 are: 1 2 7 3 6 4
        可以使用indexof操作符得到数组中某一位置上的元素:
        代码表7:

JavaFX脚本入门//returning the ordinal position of an element within an array
JavaFX脚本入门
import java.lang.System;
JavaFX脚本入门var mynumbers 
= [1,2,7,3,30,15,14,6,4];
JavaFX脚本入门var number_four 
= mynumbers[indexof . == 4];
JavaFX脚本入门System.out.println(
"Number four:{number_four}");

          结果:Number of four: 30

          当需要向数组中插入一个元素时,可以使用insert语句和下面中的一个:
              at first:插入到第一个位置
              at last:插入到最后一个位置上(默认值)
              before:在某个位置之前插入
              after:在某个位置之后插入
         从数组中删除一个元素时,可以使用delete语句
         代码表8:         

JavaFX脚本入门//insert and delete statement
JavaFX脚本入门
import java.lang.System;
JavaFX脚本入门var mynumbers 
= [1,2,7];
JavaFX脚本入门System.out.println(
"Before inserting anything:
JavaFX脚本入门JavaFX脚本入门
    ...{mynumbers}");
JavaFX脚本入门
insert 10 into mynumbers;
JavaFX脚本入门System.out.println(
"After inserting at the end
JavaFX脚本入门
    the "10" value:{mynumbers}");
JavaFX脚本入门insert [
8,6,90] as first into mynumbers;
JavaFX脚本入门System.out.println(
"After inserting at the first
JavaFX脚本入门
    positions the "8,6,90" values:{mynumbers}");
JavaFX脚本入门insert 
122 as last into mynumbers;
JavaFX脚本入门System.out.println(
"After inserting at the
JavaFX脚本入门
    end the "122" value:{mynumbers}");
JavaFX脚本入门insert 
78 before mynumbers[3];
JavaFX脚本入门insert 
11 after mynumbers[3];
JavaFX脚本入门System.out.println(
"After inserting the "78"
JavaFX脚本入门
    and "11" values before/after the 3rd
JavaFX脚本入门JavaFX脚本入门
    element:...{mynumbers}");
JavaFX脚本入门
delete mynumbers[. == 122];
JavaFX脚本入门System.out.println(
"After deleting:{mynumbers}");

         结果:
         Before inserting anything: 1 2 7
         After inserting the 10 value at the end: 1 2 7 10
         After inserting the 8, 6 and 90 values at the first position: 8 6 90 1 2 7 10
         After inserting the 122 value at the end:8 6 90 1 2 7 10
         After inserting the 78 and 1 value before/after the 3rd element: 8 6 90 78 11 1 2 7 10 122
         After deleting: 8 6 78 11 1 2 7 10

        JavaFX的一个重要的功能是其list comprehension。这个功能由selectforeach操作符实现。这里有两个从一个区间获得偶数的例子(一个使用select,一个是用foreach)。
        代码表9:     

JavaFX脚本入门//JavaFX select and foreach operators
JavaFX脚本入门
import java.lang.System;
JavaFX脚本入门JavaFX脚本入门function odd(p:Number) 
...{
JavaFX脚本入门    
return select i from i in [1.0 ..p]
JavaFX脚本入门        where (i
%2 == 0.0);
JavaFX脚本入门    }

JavaFX脚本入门var result 
= odd(10.0);
JavaFX脚本入门System.out.println(
"Odd numbers:{result}");

        结果:Odd numbers:2.0 4.0 6.0 8.0 10.0
        代码表10(和9相同,不过是使用foreach)        

JavaFX脚本入门//JavaFX select and foreach operators
JavaFX脚本入门
import java.lang.System;
JavaFX脚本入门JavaFX脚本入门function odd(p:Number) 
...{
JavaFX脚本入门    
return foreach (i in [1.0 ..p] where (i%2 == 0.0)) i;
JavaFX脚本入门    }

JavaFX脚本入门var result 
= odd(10.0);
JavaFX脚本入门System.out.println(
"Odd numbers:{result}");

        下面的例子说明foreach在创建漂亮的效果时非常有用
         代码表11 

JavaFX脚本入门//JavaFX select and foreach operators
JavaFX脚本入门
import java.lang.*;
JavaFX脚本入门
import javafx.ui.*;
JavaFX脚本入门
import javafx.ui.canvas.*;
JavaFX脚本入门JavaFX脚本入门Frame 
...{
JavaFX脚本入门    centerOnScreen: 
true
JavaFX脚本入门    visible: 
true
JavaFX脚本入门    height: 
500
JavaFX脚本入门    width: 
500
JavaFX脚本入门    title: 
"Foreach demo..."
JavaFX脚本入门JavaFX脚本入门    onClose: operation() 
...{System.exit(0);}
JavaFX脚本入门JavaFX脚本入门    content: ScrollPane 
...{
JavaFX脚本入门    background: white
JavaFX脚本入门JavaFX脚本入门    view: Canvas 
...{
JavaFX脚本入门        content: bind foreach (i in [
1..8], j in [1..8])
JavaFX脚本入门JavaFX脚本入门        Rect 
...{
JavaFX脚本入门        x: i
*30
JavaFX脚本入门        y: j
*30
JavaFX脚本入门        width:
30
JavaFX脚本入门        height:
30
JavaFX脚本入门JavaFX脚本入门        fill: Color 
...{red: (100+i) green: (100+j) blue: (100+(i*j))}
JavaFX脚本入门        stroke:white
JavaFX脚本入门        strokeWidth:
1
JavaFX脚本入门        }

JavaFX脚本入门    }

JavaFX脚本入门    }

JavaFX脚本入门}

JavaFX脚本入门
图4   运行代码表11

        如果需要使用的变量或者属性和JavaFX的关键字名字一样,可以把名字放在尖括号中间,如下:
        代码表12:

JavaFX脚本入门//Identifier quotes
JavaFX脚本入门
import java.lang.System;
JavaFX脚本入门JavaFX脚本入门
for (<<for>> in [0..3]) ...{
JavaFX脚本入门    System.out.println(
"for = {<<for>>}");
JavaFX脚本入门    }

         结果:for = 0 for = 1 for = 2 for = 3

         如果需要开发开发Swing接口时,JavaFX可以是一个非常棒的工具。因为JavaFX可以相当明显地减少代码量,并且可以非常良好地和javax.swing.*包协同工作。在前面的部分中(使用NetBeans5.5的JavaFX插件测试Hello World程序),已经看到了创建一个简单的框架是多么容易。下面的两个例子,分别创建一个Button和一个TextField
        代码表13:

JavaFX脚本入门import javafx.ui.*;
JavaFX脚本入门
import java.lang.System;
JavaFX脚本入门JavaFX脚本入门Frame
...{
JavaFX脚本入门JavaFX脚本入门    content: Button 
...{
JavaFX脚本入门    text: 
"Exit"
JavaFX脚本入门JavaFX脚本入门    action: operation() 
...{
JavaFX脚本入门    System.exit(
0);
JavaFX脚本入门    }

JavaFX脚本入门    }

JavaFX脚本入门    visible: 
true
JavaFX脚本入门}

JavaFX脚本入门
图5 运行代码表13

       代码表14:

JavaFX脚本入门import javafx.ui.*;
JavaFX脚本入门JavaFX脚本入门Frame 
...{
JavaFX脚本入门JavaFX脚本入门    content: GroupPanel 
...{
JavaFX脚本入门JavaFX脚本入门    var myRow 
= Row ...{ alignment: BASELINE }
JavaFX脚本入门JavaFX脚本入门    var label_col 
= Column ...{ alignment: TRAILING }
JavaFX脚本入门JavaFX脚本入门    var field_col 
= Column ...{ alignment: LEADING  }
JavaFX脚本入门    rows: [myRow]
JavaFX脚本入门    columns: [label_col, field_col]
JavaFX脚本入门    content:
JavaFX脚本入门JavaFX脚本入门    [SimpleLabel 
...{
JavaFX脚本入门    row: myRow
JavaFX脚本入门    column: label_col
JavaFX脚本入门    text: 
"Type your text here:"
JavaFX脚本入门    }
,
JavaFX脚本入门JavaFX脚本入门    TextField 
...{
JavaFX脚本入门    row: myRow
JavaFX脚本入门    column: field_col
JavaFX脚本入门    columns: 
50
JavaFX脚本入门    }
]
JavaFX脚本入门    }

JavaFX脚本入门    visible: 
true
JavaFX脚本入门}
;

JavaFX脚本入门
图6  运行代码表14

       可以Java.net上找到一个使用JavaFX创建Swing接口的指南。
        JavaFX代码可以很容易地集成到Java代码中。这里有一个示例,使用JavaFX将图片加载到一个框架内,允许用户选择一个矩形区域并保存。捕获和保存的操作由Java代码完成。
        代码表15:

JavaFX脚本入门import java.io.*;
JavaFX脚本入门
import javafx.ui.*;
JavaFX脚本入门
import javafx.ui.canvas.*;
JavaFX脚本入门
import javafx.ui.filter.*;
JavaFX脚本入门
import java.awt.Robot;
JavaFX脚本入门
import java.awt.Rectangle;
JavaFX脚本入门
import java.awt.image.RenderedImage;
JavaFX脚本入门
import javax.imageio.ImageIO;
JavaFX脚本入门
import java.lang.System;
JavaFX脚本入门JavaFX脚本入门
class CaptureExample extends CompositeNode...{
JavaFX脚本入门attribute lx: Integer;
JavaFX脚本入门attribute ly: Integer;
JavaFX脚本入门operation CaptureExample();
JavaFX脚本入门}

JavaFX脚本入门attribute CaptureExample.lx 
= 0;
JavaFX脚本入门attribute CaptureExample.ly 
= 0;
JavaFX脚本入门JavaFX脚本入门operation saveCapture(lx_copy:Integer, ly_copy:Integer) 
...{
JavaFX脚本入门var robot 
= new Robot();
JavaFX脚本入门var rect 
= new Rectangle (lx_copy, ly_copy, 5050);
JavaFX脚本入门var BI
=robot.createScreenCapture(rect);
JavaFX脚本入门var file 
= new File(".//capture.jpg");
JavaFX脚本入门ImageIO.write((RenderedImage)BI, 
"jpg", file);
JavaFX脚本入门}

JavaFX脚本入门function CaptureExample.composeNode() 
=
JavaFX脚本入门JavaFX脚本入门Group
...{
JavaFX脚本入门    transform: []
JavaFX脚本入门JavaFX脚本入门    content:[ImageView 
...{
JavaFX脚本入门    transform: []
JavaFX脚本入门JavaFX脚本入门    image: Image 
...{ url: ".//app//Sunset.gif" }
JavaFX脚本入门    cursor: DEFAULT
JavaFX脚本入门JavaFX脚本入门    onMouseClicked: operation(e:CanvasMouseEvent) 
...{
JavaFX脚本入门    saveCapture(e.source.XOnScreen,e.source.YOnScreen);
JavaFX脚本入门    }

JavaFX脚本入门JavaFX脚本入门    onMouseMoved: operation(e:CanvasMouseEvent) 
...{
JavaFX脚本入门    lx 
= e.x;
JavaFX脚本入门    ly 
= e.y;
JavaFX脚本入门    }

JavaFX脚本入门    }
,
JavaFX脚本入门JavaFX脚本入门    Rect
...{
JavaFX脚本入门    x: bind lx
JavaFX脚本入门    y: bind ly
JavaFX脚本入门    width: 
50
JavaFX脚本入门    height:
50
JavaFX脚本入门    strokeWidth: 
1
JavaFX脚本入门    stroke: black
JavaFX脚本入门    }
]
JavaFX脚本入门    }
;
JavaFX脚本入门JavaFX脚本入门Frame 
...{
JavaFX脚本入门    centerOnScreen: 
true
JavaFX脚本入门    visible: 
true
JavaFX脚本入门    height: 
230
JavaFX脚本入门    width: 
300
JavaFX脚本入门    title: 
"Capture the screen..."
JavaFX脚本入门JavaFX脚本入门    onClose: operation() 
...{System.exit(0);}
JavaFX脚本入门JavaFX脚本入门    content: ScrollPane 
...{
JavaFX脚本入门    background: white
JavaFX脚本入门JavaFX脚本入门    view: Canvas 
...{
JavaFX脚本入门    background: black
JavaFX脚本入门    cursor: DEFAULT
JavaFX脚本入门    content: CaptureExample
JavaFX脚本入门    }

JavaFX脚本入门   }

JavaFX脚本入门}

         注意bind的使用。这是JavaFX一个重要的操作符,用来属性的增量和懒惰求值(incremental and lazy evaluation of attributes)。你可以在JavaFX编程语言文档上找到更多关于该操作符的信息。
         同样,需要注意的是,在上面的应用程序中使用了两个鼠标事件进行交互:鼠标点击(onMouseClicked)和鼠标移动(onMouseMoved)。JavaFX支持下列鼠标事件:
        onMouseClicked
        onMouseMoved
        onMousePressed
        onMouseExited
        onMouseEntered
        onMouseReleased
        onMouseDragged
        使用JavaFX的do later语句可以异步执行代码,如下:
        代码表16:

JavaFX脚本入门Listing 16
JavaFX脚本入门
//asynchronous execution with do later statement
JavaFX脚本入门
import java.lang.System;
JavaFX脚本入门var s1 
= "My name is ";
JavaFX脚本入门var s2 
= "Anghel Leonard";
JavaFX脚本入门JavaFX脚本入门    
do later ...{
JavaFX脚本入门    System.out.println(s2);
JavaFX脚本入门    }

JavaFX脚本入门System.out.println(s1);

         结果:My name is Anghel Leonard
         JavaFX允许把部分代码放在do语句中,然后在一个单独的线程中执行。使用AWT事件分发线程(AWT Event Dispatch Thread)技术可以处理所有引入的事件。下面是一个示例,在do语句中使用了无限循环。注意,即使有一个无限循环仍然可以正常关闭窗口。
        代码表17:

JavaFX脚本入门import javafx.ui.*;
JavaFX脚本入门
import java.lang.System;
JavaFX脚本入门
import javafx.ui.canvas.*;
JavaFX脚本入门
import java.util.Random;
JavaFX脚本入门JavaFX脚本入门
class DoExample extends CompositeNode...{
JavaFX脚本入门attribute randomfill: Color;
JavaFX脚本入门operation changeOpacity();
JavaFX脚本入门}

JavaFX脚本入门JavaFX脚本入门attribute DoExample.randomfill 
= Color...{red:0 green:0 blue:0};
JavaFX脚本入门JavaFX脚本入门operation DoExample.changeOpacity() 
...{
JavaFX脚本入门JavaFX脚本入门
do...{
JavaFX脚本入门    
while(true)
JavaFX脚本入门JavaFX脚本入门    
...{
JavaFX脚本入门    var r 
= new Random();
JavaFX脚本入门    var g 
= r.nextInt(255);
JavaFX脚本入门JavaFX脚本入门    randomfill 
= Color...{red:g green:g blue:g};
JavaFX脚本入门    }

JavaFX脚本入门}

JavaFX脚本入门}

JavaFX脚本入门function DoExample.composeNode() 
=
JavaFX脚本入门JavaFX脚本入门Group 
...{
JavaFX脚本入门    transform: []
JavaFX脚本入门    content: [
JavaFX脚本入门JavaFX脚本入门    Text 
...{
JavaFX脚本入门    x: 
20
JavaFX脚本入门    y: 
20
JavaFX脚本入门    content: 
"Because of "do" you can close this window..."
JavaFX脚本入门JavaFX脚本入门    font: Font 
...{face: VERDANA, style: [ITALIC, BOLD], size: 20}
JavaFX脚本入门    fill: bind randomfill
JavaFX脚本入门    opacity: 
0.5
JavaFX脚本入门JavaFX脚本入门    onMouseClicked: operation(e:CanvasMouseEvent) 
...{
JavaFX脚本入门    changeOpacity();
JavaFX脚本入门    }

JavaFX脚本入门    }
]
JavaFX脚本入门}
;
JavaFX脚本入门JavaFX脚本入门Frame 
...{
JavaFX脚本入门    centerOnScreen: 
true
JavaFX脚本入门    visible: 
true
JavaFX脚本入门    height: 
100
JavaFX脚本入门    width: 
580
JavaFX脚本入门    title: 
""Do" example..."
JavaFX脚本入门JavaFX脚本入门    onClose: operation() 
...{System.exit(0);}
JavaFX脚本入门JavaFX脚本入门    content: ScrollPane 
...{
JavaFX脚本入门    background: white
JavaFX脚本入门JavaFX脚本入门    view: Canvas 
...{
JavaFX脚本入门    background: black
JavaFX脚本入门    cursor: DEFAULT
JavaFX脚本入门    content: DoExample
JavaFX脚本入门    }

JavaFX脚本入门    }

JavaFX脚本入门}

        使用JavaFX的Label类可以将JavaFX代码和HTML代码集成到HTML代码中。这个类支持和web应用程序中同样方式的HMTL和CSS。下面是一个渲染HTML表格的例子。
        代码表18

JavaFX脚本入门import javafx.ui.*;
JavaFX脚本入门
import java.lang.System;
JavaFX脚本入门
import javafx.ui.canvas.*;
JavaFX脚本入门JavaFX脚本入门
class Partners ...{
JavaFX脚本入门    attribute name: String;
JavaFX脚本入门    attribute company: String;
JavaFX脚本入门    attribute phone: String;
JavaFX脚本入门    attribute e_mail: String;
JavaFX脚本入门    attribute partners: Partners
*;
JavaFX脚本入门    }

JavaFX脚本入门JavaFX脚本入门    var myPartners 
= Partners ...{
JavaFX脚本入门JavaFX脚本入门    partners: [Partners
...{
JavaFX脚本入门    name: 
"Mary J"
JavaFX脚本入门    company: 
"Software ATV Inc."
JavaFX脚本入门    phone: 
"0900090345"
JavaFX脚本入门    e_mail: 
"maryj@yahoo.com"
JavaFX脚本入门    }
,
JavaFX脚本入门JavaFX脚本入门    Partners
...{
JavaFX脚本入门    name: 
"Leona W"
JavaFX脚本入门    company: 
"Winkle LTD"
JavaFX脚本入门    phone: 
"090849435"
JavaFX脚本入门    e_mail: 
"leonaw@yahoo.com"
JavaFX脚本入门    }
,
JavaFX脚本入门JavaFX脚本入门    Partners
...{
JavaFX脚本入门    name: 
"Joe T"
JavaFX脚本入门    company: 
"Press OJ"
JavaFX脚本入门    phone: 
"340909879"
JavaFX脚本入门    e_mail: 
"joet@yahoo.com"
JavaFX脚本入门    }
]
JavaFX脚本入门    }
;
JavaFX脚本入门JavaFX脚本入门    Frame 
...{
JavaFX脚本入门JavaFX脚本入门    content: Label 
...{
JavaFX脚本入门    text: bind 
"<html>
JavaFX脚本入门
    <h2 align='center'>- My Partners -</h2>
JavaFX脚本入门    
<table align='center' border='0' bgcolor='#BBAAEE'>
JavaFX脚本入门    
<tr bgcolor='#FFEE55'>
JavaFX脚本入门    
<td><b>Name</b></td>
JavaFX脚本入门    
<td><b>Company</b></td>
JavaFX脚本入门    
<td><b>Phone</b></td>
JavaFX脚本入门    
<td><b>E-mail</b></td>
JavaFX脚本入门    
</tr>
JavaFX脚本入门JavaFX脚本入门    
...{
JavaFX脚本入门    
if (sizeof myPartners.partners == 0)
JavaFX脚本入门    then 
"<tr bgcolor='#432211'><td colspan='8'><b>
JavaFX脚本入门
    I have no partners...</b></td></tr>"
JavaFX脚本入门
    else foreach (t in myPartners.partners)
JavaFX脚本入门    
"<tr bgcolor='#FF25AD'>
JavaFX脚本入门JavaFX脚本入门
    <td>...{t.name}</td>
JavaFX脚本入门JavaFX脚本入门    
<td>...{t.company}</td>
JavaFX脚本入门JavaFX脚本入门    
<td>...{t.phone}</td>
JavaFX脚本入门JavaFX脚本入门    
<td>...{t.e_mail}</td>
JavaFX脚本入门    
</tr>"
JavaFX脚本入门
    }

JavaFX脚本入门    
</table>
JavaFX脚本入门    
</html>"
JavaFX脚本入门
    }

JavaFX脚本入门    visible: 
true
JavaFX脚本入门    }

JavaFX脚本入门
图7  运行代码表18
        在本文的最后异步部分,我们将要看到两个程序,它们演示了使用JavaFX创建复杂动画是多么容易。第一个程序模拟钟表。这个设计基于四个使用JavaFX代码实现其动画的图片。
        代码表19

JavaFX脚本入门import javafx.ui.*;
JavaFX脚本入门
import javafx.ui.canvas.*;
JavaFX脚本入门
import javafx.ui.filter.*;
JavaFX脚本入门
import java.lang.System;
JavaFX脚本入门JavaFX脚本入门
class Clock extends CompositeNode...{
JavaFX脚本入门attribute seconds: Number
+;
JavaFX脚本入门attribute minutes: Number
+;
JavaFX脚本入门attribute hours: Number
+;
JavaFX脚本入门operation startClock();
JavaFX脚本入门}

JavaFX脚本入门attribute Clock.seconds 
= 360;
JavaFX脚本入门attribute Clock.minutes 
= 360;
JavaFX脚本入门attribute Clock.hours 
= 360;
JavaFX脚本入门JavaFX脚本入门operation Clock.startClock() 
...{
JavaFX脚本入门JavaFX脚本入门
do...{
JavaFX脚本入门    
while(true)
JavaFX脚本入门JavaFX脚本入门    
...{
JavaFX脚本入门JavaFX脚本入门    
if(seconds>=360...{seconds = [0,6..360]
JavaFX脚本入门     dur 
60000 linear;}

JavaFX脚本入门JavaFX脚本入门    
if(minutes>=360...{minutes = 0; minutes = [0,6..360]
JavaFX脚本入门     dur 
3600000 linear;}

JavaFX脚本入门JavaFX脚本入门    
if(hours>=360...{hours = 0;hours = [0,6..360]
JavaFX脚本入门     dur 
43200000 linear;}

JavaFX脚本入门    }

JavaFX脚本入门    }

JavaFX脚本入门}

JavaFX脚本入门function Clock.composeNode() 
= 
JavaFX脚本入门JavaFX脚本入门Group 
...{
JavaFX脚本入门JavaFX脚本入门    onMouseClicked: operation(e:CanvasMouseEvent) 
...{
JavaFX脚本入门    startClock();
JavaFX脚本入门    }

JavaFX脚本入门    transform: []
JavaFX脚本入门JavaFX脚本入门    content:[ImageView 
...{
JavaFX脚本入门JavaFX脚本入门    image: Image 
...{ url: ".//app//clockempty.gif" }
JavaFX脚本入门    }
,
JavaFX脚本入门JavaFX脚本入门ImageView 
...{
JavaFX脚本入门    transform: bind [translate(
203,82),
JavaFX脚本入门     rotate (seconds,
2.5,125)]
JavaFX脚本入门JavaFX脚本入门    image: Image 
...{ url: ".//app//l1.gif" }
JavaFX脚本入门    antialias: 
true
JavaFX脚本入门    }
,
JavaFX脚本入门JavaFX脚本入门ImageView 
...{
JavaFX脚本入门    transform:  bind [translate(
203,100),
JavaFX脚本入门     rotate (minutes,
2.5,107)]
JavaFX脚本入门JavaFX脚本入门    image: Image 
...{ url: ".//app//l2.gif" }
JavaFX脚本入门    antialias: 
true
JavaFX脚本入门    }
,
JavaFX脚本入门JavaFX脚本入门ImageView 
...{
JavaFX脚本入门    transform:  bind [translate(
203,115),
JavaFX脚本入门     rotate (hours,
2.5,92)]
JavaFX脚本入门JavaFX脚本入门    image: Image 
...{ url: ".//app//l3.gif" }
JavaFX脚本入门    antialias: 
true
JavaFX脚本入门    }
,
JavaFX脚本入门JavaFX脚本入门Circle 
...{
JavaFX脚本入门    cx: 
205
JavaFX脚本入门    cy: 
205
JavaFX脚本入门    radius: 
13
JavaFX脚本入门    fill: red
JavaFX脚本入门    strokeWidth: 
1
JavaFX脚本入门    }
]
JavaFX脚本入门}
;
JavaFX脚本入门JavaFX脚本入门Frame 
...{
JavaFX脚本入门    centerOnScreen: 
true
JavaFX脚本入门    visible: 
true
JavaFX脚本入门    height: 
450
JavaFX脚本入门    width: 
450
JavaFX脚本入门    title: 
"JavaFX - Clock"
JavaFX脚本入门JavaFX脚本入门    onClose: operation() 
...{System.exit(0);}
JavaFX脚本入门JavaFX脚本入门    content: ScrollPane 
...{
JavaFX脚本入门    background: white
JavaFX脚本入门JavaFX脚本入门    view: Canvas 
...{
JavaFX脚本入门    background: black
JavaFX脚本入门    cursor: DEFAULT
JavaFX脚本入门    content: Clock
JavaFX脚本入门    }

JavaFX脚本入门    }

JavaFX脚本入门}

JavaFX脚本入门
图8 运行代码表19
       注意dur(持续时间)操作符。JavaFX提供了此操作符来创建动画。它用来将数组异步应用到一个时间间隔上。在从数组中返回一个元素之前,JavaFX会等待以毫秒为单位的一段时间。这个过程会持续到返回数组中的所有元素。有以下四种插值(interpolation)类型:
        linear
        easein
        easeout
        easeboth
        默认值是ease-in和ease-out的结合。

        第二个程序模拟一系列的弹出菜单,并且可以在屏幕上拖动。点击菜单顶部时会使用漂亮的透明效果来隐藏或者显示该菜单。该例中使用JavaFX的绘画能力完成整个设计:
       代码表20

JavaFX脚本入门import javafx.ui.*;
JavaFX脚本入门
import javafx.ui.canvas.*;
JavaFX脚本入门
import javafx.ui.filter.*;
JavaFX脚本入门
import java.lang.System;
JavaFX脚本入门JavaFX脚本入门
class MenuOptions extends CompositeNode...{
JavaFX脚本入门attribute px: Integer;
JavaFX脚本入门attribute py: Integer;
JavaFX脚本入门attribute lx: Integer;
JavaFX脚本入门attribute ly:Integer;
JavaFX脚本入门attribute lw:Integer;
JavaFX脚本入门attribute itemsOpacity:Number;
JavaFX脚本入门attribute menutext: String;
JavaFX脚本入门}

JavaFX脚本入门JavaFX脚本入门trigger on 
new MenuOptions ...{
JavaFX脚本入门    
this.px = 0;
JavaFX脚本入门    
this.py = 0;
JavaFX脚本入门    
this.menutext = "";
JavaFX脚本入门    
this.lx = 0;
JavaFX脚本入门    
this.ly = 0;
JavaFX脚本入门    
this.lw = 150;
JavaFX脚本入门    
this.itemsOpacity = 0.0;
JavaFX脚本入门    }

JavaFX脚本入门function MenuOptions.composeNode() 
= 
JavaFX脚本入门JavaFX脚本入门Group 
...{
JavaFX脚本入门    transform: bind []
JavaFX脚本入门    opacity: bind itemsOpacity
JavaFX脚本入门JavaFX脚本入门    content:[Rect 
...{
JavaFX脚本入门    x: bind lx
JavaFX脚本入门    y: bind ly
JavaFX脚本入门    width: lw
JavaFX脚本入门    height: 
20
JavaFX脚本入门    arcHeight: 
10
JavaFX脚本入门    arcWidth: 
10
JavaFX脚本入门JavaFX脚本入门    fill: Color 
...{red:190 green:181 blue:215}
JavaFX脚本入门JavaFX脚本入门    stroke: Color 
...{red:68 green:54 blue:103}
JavaFX脚本入门    strokeWidth: 
2
JavaFX脚本入门JavaFX脚本入门    onMouseEntered: operation(e:CanvasMouseEvent) 
...{
JavaFX脚本入门JavaFX脚本入门    
if(itemsOpacity == 0.7...{itemsOpacity = 1.0;}
JavaFX脚本入门    }

JavaFX脚本入门JavaFX脚本入门    onMouseExited: operation(e:CanvasMouseEvent) 
...{
JavaFX脚本入门JavaFX脚本入门    
if(itemsOpacity == 1.0...{itemsOpacity = 0.7;}
JavaFX脚本入门    }

JavaFX脚本入门JavaFX脚本入门    onMouseClicked: operation(e:CanvasMouseEvent) 
...{
JavaFX脚本入门    eventListener(
this.menutext);
JavaFX脚本入门    }

JavaFX脚本入门    }
,
JavaFX脚本入门JavaFX脚本入门    Text 
...{
JavaFX脚本入门    x: bind lx
+5
JavaFX脚本入门    y: bind ly
+5
JavaFX脚本入门    content: bind menutext
JavaFX脚本入门JavaFX脚本入门    font: Font 
...{face: VERDANA, style: [BOLD], size: 11}
JavaFX脚本入门JavaFX脚本入门    fill:Color 
...{red:68 green:54 blue:103}
JavaFX脚本入门    }
]
JavaFX脚本入门    }
;
JavaFX脚本入门JavaFX脚本入门
class MainMenu extends CompositeNode...{
JavaFX脚本入门attribute option: String;
JavaFX脚本入门attribute px: Integer;
JavaFX脚本入门attribute py: Integer;
JavaFX脚本入门attribute lx: Integer;
JavaFX脚本入门attribute ly:Integer;
JavaFX脚本入门attribute lw:Integer;
JavaFX脚本入门attribute menutext: String;
JavaFX脚本入门attribute step: Integer;
JavaFX脚本入门attribute submenu: MenuOptions
+;
JavaFX脚本入门operation addSubmenu(t:MenuOptions);
JavaFX脚本入门operation show_hide();
JavaFX脚本入门}

JavaFX脚本入门JavaFX脚本入门trigger on 
new MainMenu ...{
JavaFX脚本入门    
this.option = "";
JavaFX脚本入门    
this.px = 0;
JavaFX脚本入门    
this.py = 0;
JavaFX脚本入门    
this.menutext = "";
JavaFX脚本入门    
this.lx = 0;
JavaFX脚本入门    
this.ly = 0;
JavaFX脚本入门    
this.lw = 150;
JavaFX脚本入门    
this.step = 20;
JavaFX脚本入门    
this.submenu = null;
JavaFX脚本入门    }

JavaFX脚本入门JavaFX脚本入门operation MainMenu.addSubmenu(t:MenuOptions) 
...{
JavaFX脚本入门t.lx 
= this.lx;
JavaFX脚本入门t.lw 
= this.lw;
JavaFX脚本入门t.ly 
= this.ly+step;
JavaFX脚本入门step
=step+20;
JavaFX脚本入门insert t into submenu;
JavaFX脚本入门}

JavaFX脚本入门JavaFX脚本入门operation MainMenu.show_hide() 
...{
JavaFX脚本入门JavaFX脚本入门
if(submenu.itemsOpacity[1== 0.7)...{submenu.itemsOpacity =
JavaFX脚本入门 [
0.7,0.6,0.5,0.4,0.3,0.2,0.1,0.0] dur 1200;}

JavaFX脚本入门JavaFX脚本入门    
else if(submenu.itemsOpacity[1== 0.0)...{
JavaFX脚本入门    submenu.itemsOpacity 
=
JavaFX脚本入门     [
0.1,0.2,0.3,0.4,0.5,0.6,0.7] dur 1200;}

JavaFX脚本入门}

JavaFX脚本入门function MainMenu.composeNode() 
= 
JavaFX脚本入门JavaFX脚本入门Group 
...{
JavaFX脚本入门    transform: bind []
JavaFX脚本入门JavaFX脚本入门    content:[Rect 
...{
JavaFX脚本入门    x: bind lx
JavaFX脚本入门    y: bind ly
JavaFX脚本入门    height: 
20
JavaFX脚本入门    width: bind lw
JavaFX脚本入门    arcHeight: 
10
JavaFX脚本入门    arcWidth: 
10
JavaFX脚本入门JavaFX脚本入门    fill: Color 
...{red:68 green:54 blue:103}
JavaFX脚本入门JavaFX脚本入门    stroke: Color 
...{red:190 green:181 blue:215}
JavaFX脚本入门    strokeWidth: 
2
JavaFX脚本入门JavaFX脚本入门    onMouseDragged: operation(e:CanvasMouseEvent) 
...{
JavaFX脚本入门    lx 
+= e.localDragTranslation.x;
JavaFX脚本入门    ly 
+= e.localDragTranslation.y;
JavaFX脚本入门    submenu.lx 
+= e.localDragTranslation.x;
JavaFX脚本入门    submenu.ly 
+= e.localDragTranslation.y;
JavaFX脚本入门    }

JavaFX脚本入门JavaFX脚本入门    onMouseClicked: operation(e:CanvasMouseEvent) 
...{
JavaFX脚本入门    show_hide();
JavaFX脚本入门    }

JavaFX脚本入门    }
,
JavaFX脚本入门JavaFX脚本入门    Text 
...{
JavaFX脚本入门    x: bind lx
+5
JavaFX脚本入门    y: bind ly
+5
JavaFX脚本入门    content: bind menutext
JavaFX脚本入门JavaFX脚本入门    font: Font 
...{face: VERDANA, style: [BOLD], size: 11}
JavaFX脚本入门JavaFX脚本入门    fill:Color 
...{red:190 green:181 blue:215}
JavaFX脚本入门    }
,
JavaFX脚本入门    bind submenu]
JavaFX脚本入门}
;
JavaFX脚本入门var menu_1 
= new MainMenu();
JavaFX脚本入门menu_1.lx 
= 120;
JavaFX脚本入门menu_1.ly 
= 140;
JavaFX脚本入门menu_1.lw 
= 128;
JavaFX脚本入门menu_1.menutext 
= "Navigate";
JavaFX脚本入门var submenu_11 
= new MenuOptions();
JavaFX脚本入门submenu_11.menutext 
= "Go to Class...";
JavaFX脚本入门var submenu_12 
= new MenuOptions();
JavaFX脚本入门submenu_12.menutext 
= "Go to Test";
JavaFX脚本入门var submenu_13 
= new MenuOptions();
JavaFX脚本入门submenu_13.menutext 
= "Back";
JavaFX脚本入门var submenu_14 
= new MenuOptions();
JavaFX脚本入门submenu_14.menutext 
= "Forward";
JavaFX脚本入门var submenu_15 
= new MenuOptions();
JavaFX脚本入门submenu_15.menutext 
= "Go to Line...";
JavaFX脚本入门menu_1.addSubmenu(submenu_11);
JavaFX脚本入门menu_1.addSubmenu(submenu_12);
JavaFX脚本入门menu_1.addSubmenu(submenu_13);
JavaFX脚本入门menu_1.addSubmenu(submenu_14);
JavaFX脚本入门menu_1.addSubmenu(submenu_15);
JavaFX脚本入门var menu_2 
= new MainMenu();
JavaFX脚本入门menu_2.lx 
= 260;
JavaFX脚本入门menu_2.ly 
= 140;
JavaFX脚本入门menu_2.lw 
= 90;
JavaFX脚本入门menu_2.menutext 
= "Refactor";
JavaFX脚本入门var submenu_21 
= new MenuOptions();
JavaFX脚本入门submenu_21.menutext 
= "Rename....";
JavaFX脚本入门var submenu_22 
= new MenuOptions();
JavaFX脚本入门submenu_22.menutext 
= "Pull Up...";
JavaFX脚本入门var submenu_23 
= new MenuOptions();
JavaFX脚本入门submenu_23.menutext 
= "Push Down...";
JavaFX脚本入门menu_2.addSubmenu(submenu_21);
JavaFX脚本入门menu_2.addSubmenu(submenu_22);
JavaFX脚本入门menu_2.addSubmenu(submenu_23);
JavaFX脚本入门JavaFX脚本入门operation eventListener(s:String) 
...{
JavaFX脚本入门System.out.println(
"You choose:{s}");
JavaFX脚本入门}

JavaFX脚本入门JavaFX脚本入门Frame 
...{
JavaFX脚本入门    centerOnScreen: 
true
JavaFX脚本入门    visible: 
true
JavaFX脚本入门    height: 
500
JavaFX脚本入门    width: 
500
JavaFX脚本入门    title: 
"JavaFX - Menu"
JavaFX脚本入门JavaFX脚本入门    onClose: operation() 
...{System.exit(0);}
JavaFX脚本入门JavaFX脚本入门    content: ScrollPane 
...{
JavaFX脚本入门    background: white
JavaFX脚本入门JavaFX脚本入门    view: Canvas 
...{
JavaFX脚本入门    background: black
JavaFX脚本入门    cursor: DEFAULT
JavaFX脚本入门    content: [menu_1, menu_2]
JavaFX脚本入门    }

JavaFX脚本入门    }

JavaFX脚本入门}

JavaFX脚本入门
图9  运行代码表20
        注意,JavaFX使用触发器(类似SQL)代替构造函数。触发器使用关键字trigger标识,有头和体组成。头说明了在执行触发器体的内容之前必须发生的事件。触发器管理的事件可以是创建(created)、插入(inserted)、删除(deleted)或者替换(replaced)。关于触发器的更多细节请在OpenJFX网站上查找。

       总结(Conclusion)

        JavaFX脚本(JavaFX Script)一门兼容Java平台的新语言。使用它,你可以轻松创建丰富的、动态的用户界面,而它花费的时间比使用Java Swing和Java 2D创建同样效果要少得多。在本文中,我们逐步学习了基础语法、IDE支持,并且建立了演示程序,它们展示了JavaFX的部分功能。很快,JavaFX就会成为Java开发者工具箱中必不可少的工具。

         相关资源(Resources)      

Sample code for this article (for running the examples create a new NetBeans project) The offical JavaFX site: from here you can download demos, specifications and plug-ins JavaFX classes documentation: get help with JavaFX classes Plug-in for NetBeans: get the JavaFX plug-in for NetBeans Plug-in for Eclipse: get the JavaFX plug-in for Eclipse 

           关于作者
          Anghel Leonard是一个有超过12年开发经验的高级Java开发人员,专注于GIS应用开发。他已经写了两本关于XML和Java的著作。
                  
上一篇:SpringBoot基础之banner玩法解析


下一篇:《JavaScript精粹(修订版)》——1.7 给页面添加脚本