为什么又要一个脚本语言?
如今脚本语言当然受到了很多的压力。在以前的文章中,我曾经写过 Ruby、 JavaScript、 Python、JavaServer Pages和Linden Scripting Language等Web service客户端。这些不同的语言共同的目的是尝试着通过提供一种连接现有组件的简单方式来让复杂应用的编写变的更加容易。在JFX的情况中,它最关 心的组件是Swing用户接口组件,该组件最初出现在Java标准库1.2版以补充相当原始的Java AWT工具。
JFX基础
这个语言支持常见的变量类型,比如字符串、整型、浮点型和布尔值。对于list和array的扩展支持的语法,在我看来非常强大。这个语言还提供了异常的 创建和处理,并且引入了新的想法,即任何对象可以被抛出,不仅仅是标准的Java Throwable类型。JFX脚本还可以导入Java类、创建Java对象和调用他们的方法。
JFX对象通过声明的方法来创建。这对于那些为“swing”Java用户接口类提供简化的class非常有用。我们在下面的完整脚本中查看一下JFX对象是如何通过声明的方式来创建的。
import javafx.ui.*;
Frame {
title: "Hello World from JavaFX"
width: 200
height: 80
content: Button {
text: "Hello World"
}
visible: true
}
Frame {
title: "Hello World from JavaFX"
width: 200
height: 80
content: Button {
text: "Hello World"
}
visible: true
}
在这个例子中,Frame和Button是用来隐藏将在屏幕上显示出来的JFrame和JButton对象的创建细节的脚本类型。这个Frame类有名为“title”、“width”、“height”、“content”和“visible”的公共“属性”,它们都在声明中被设置了。
消息处理问题
JFX 也有每一个图形用户接口工具都会遇到的问题。点击按钮之类的用户事件一定不能和需要长时间执行任务的事件处理线程绑定,因为在该任务执行的时候,这个接口 会毫无反应。JFX提供了“do”和“do later”原语来处理这个问题。我使用一段脚本来试验JFX显示出从天气预报服务站点检索出来的数据,其中使用了“do later”。首先,我定义了一个叫做WeatherData的JFX类。这个类有两个属性和一个操作。
import javafx.ui.*;
import java.net.URL;
import java.lang.StringBuffer ;
import java.lang.System;
import java.io.InputStreamReader;
import java.io.BufferedReader;
class WeatherData ...{
attribute source: String ;
attribute text: String ;
operation update();
}
import java.net.URL;
import java.lang.StringBuffer ;
import java.lang.System;
import java.io.InputStreamReader;
import java.io.BufferedReader;
class WeatherData ...{
attribute source: String ;
attribute text: String ;
operation update();
}
<script type="text/javascript"><!-- google_ad_client = "pub-1572879403720716"; google_ad_width = 336; google_ad_height = 280; google_ad_format = "336x280_as"; google_ad_type = "text_image"; google_ad_channel ="2957605308"; google_alternate_ad_url ="http://www.pcdog.com/js/336.htm"; google_color_border = "F5FAFA"; google_color_bg = "F5FAFA"; google_color_link = "1F3A87"; google_color_url = "0000FF"; google_color_text = "000000" google_language = 'zh-CN'; //--></script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script> 真正的代码分开定义如下:
operation WeatherData.update(){
var content = new StringBuffer("");
do later {
var url = new URL( source );
var is = url.openStream();
var reader = new BufferedReader(new InputStreamReader(is));
var line;
while (true) {
line = reader.readLine();
if (line == null) { break;
}
content.append(line);
content.append("/n");
} // end while
is.close();
text = content.toString();
} // end do later
}
var content = new StringBuffer("");
do later {
var url = new URL( source );
var is = url.openStream();
var reader = new BufferedReader(new InputStreamReader(is));
var line;
while (true) {
line = reader.readLine();
if (line == null) { break;
}
content.append(line);
content.append("/n");
} // end while
is.close();
text = content.toString();
} // end do later
}
现在创建窗口来表示用户接口。注意这个Frame被定义成有一个WeatherData类的本地实例。其中的URL是用来获得我所在的县下周的天气预报。
Frame {
var wdata = WeatherData {
text: "initialized"
source: "http://forecast.weather.gov/MapClick.php?zoneid=TXZ173&TextType=1"
}
title: "Weather Forcast"
width: 400
height: 400
background: cyan
content: BorderPanel {
border: EmptyBorder{ top: 10 left: 10 bottom: 10 right: 10
}
top: Button {
text: "update"
action: operation(){ wdata.update();}
height: 80
}
center: TextArea { text: bind wdata.text
}
} // close content
visible: true
}
var wdata = WeatherData {
text: "initialized"
source: "http://forecast.weather.gov/MapClick.php?zoneid=TXZ173&TextType=1"
}
title: "Weather Forcast"
width: 400
height: 400
background: cyan
content: BorderPanel {
border: EmptyBorder{ top: 10 left: 10 bottom: 10 right: 10
}
top: Button {
text: "update"
action: operation(){ wdata.update();}
height: 80
}
center: TextArea { text: bind wdata.text
}
} // close content
visible: true
}
JFX所缺少的东西
JFX语言提供的功能当中最明显的缺憾就是少了像处理 swing对象一样方便的操纵 XML数据的方法。当然你可以创建自己定制的 Java类,并在JFX脚本中使用它们,但是如果能够在处理基于XML的Web service中使用XQuery或者XPath的语法,那么就太方便了。
IDE的支持
我在NetBeans 5.5和 Eclipse IDE中都找到了插件。NetBeans的插件提供了对编辑语法和用法的支持,但是不完全JavaDocs类型的文档。NetBeans插件不支持图形接口版面,但是这应该不是很难增加。另外一个商业的IDE,ReportMill,正在尝试在他们的报表设计编辑器中支持JFX。
谁将是它的竞争对手?
假设JFX在使用Swing组件创建富用户接口方面已经做的很好,让我们想想谁会与之竞争。在我看来,Flash是当今Internet上使用得最广的富用户接口技术。Flash拥有巨大的优势,因为它几乎在所有的Internet用户浏览器上安装了,并且很容易被升级。
几年前,我注意到了Flex脚本语言,它可以被用于使用XML来定义Flash用户接口,但是在当时这套开发工具的许可证费用非常昂贵。Adobe收购了Macromedia改变了这种状况,现在有一个免费的Flex编辑器并且计划将Flex的“核心”作为开放源代码项目,而更高级的工具继续作为商业产品。
结论
Sun的JavaFX还处于开发的早期阶段。虽然有一些IDE的支持,但是我们仍然缺少正式的文档。凭借着Sun和开放源代码社区的支持,JFX在先进Web service客户端的创建中值得考虑