“JAVA”目录存档

Java代码调用JavaFX的例子

2009年06月23日,星期二

在JavaFX 1.0发布之后,本人撰写的文章JavaFX和Java之间的互操作性被各网站转载。文中总结了3种从Java调用JavaFX的方法。这三种方法分别为: http://www.javafxblogs.com

1. 用ScriptEngineManager类。这是基于JSR-223规范的java脚本API( scripting API)。可以在java程序中运行一些脚本,如 JavaFX script, javascript等。
2. 通过JavaFX reflection API。这是JavaFX提供的反射API,几乎可以调用所有的JavaFX类。
3. 先用JavaFX类实现一个Java的interface,然后Java程序可以通过这个interface来调用JavaFX的功能。这中间的interface起了个桥梁的作用。

第三种方法应该是比较“正规”而且“优美”的调用方式。但是也有一点不足:程序代码的入口必须从JavaFX启动。这是因为JavaFX程序比 较容易生成JavaFX类的实例,从而可以供Java方使用。可是我们有时会碰到一些特定的情况,需要从Java端启动代码。例如,如果你已经有了一个较 完整的Java程序,你需要用调用JavaFX的某些功能,这时候较好的方法是把Java作为程序的入口。为了解决这个问题,我把第2和第3种方法作了融 合,大家可以看看下面的例子。纯Java代码调用JavaFX的例子

www.JavaFXblogs.com

下一步是创建JavaFX类MyChart来实现这个interface:

www.JavaFXblogs.com www.JavaFXblogs.com

www.JavaFXblogs.com
在代码中,这3句是创建JavaFX类javatest.MyChart实例,

    Context context = FXLocal.getContext();
    FXClassType instance = context.findClass("javatest.MyChart");
    ObjectValue obj = (ObjectValue)instance.newInstance();

而一下这句则是把JavaFX实例转化为Java可用的对象:

    JavaInterface ji = (JavaInterface)obj.asObject();

如果你用的是NetBeans IDE, 你可以在项目属性中把javatest.JavaTest类设为主类(Main class)(即启动类)。编译之后会生成一个javatest.jar文件。程序运行的结果如图:

Java PieChart via JavaFX
在命令行中可以采用以下方式: http://developers.sun.com/blog/henry

   javafx -jar javatest.jar

实际上,可以用纯Java的方式来启动程序,只要把JavaFX的运行环境带上即可,如:JavaFX程序例子、教程

 java -Djava.library.path="<path to javafx sdk lib>"
     -classpath "<all javafx sdk jars>" -jar javatest.jar

因为JavaFX需要的jar文件很多,因此这种“最纯”的java方法使用起来比较麻烦。我觉得还是用javafx命令简洁些, 而且javafx就是上述java命令的封装而已。

如果有问题,请留言讨论。

本文的英文译文同步发表于:Calling JavaFX Classes from Pure Java Code. 中文同步发表于:用纯Java代码调用JavaFX的功能

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

2008年12月23日,星期二

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

iPhone圣诞前恐无法支持Java和Flash

2008年12月14日,星期天

据国外媒体报道,尽管现在离圣诞节还有一点时间,但是苹果iPhone用户恐怕很难在节日前能够看到自己的手机能够支持Java和Flash。早在一年前,Sun和Adobe就声称愿意为支持iPhone做努力,但是直到现在,无论是Flash播放器,还是Java虚拟机都不能运行在 iPhone上。而且人们看不到这一计划有任何进展。

Sun和Adobe在这一整年时间中一直在不断重复自己的话,而苹果却一直保持沉默。

iPhone如果能够支持Java和Flash,将会大大扩大可以运行在它上面的应用程序的数量。但是,没人知道为什么至今iPhone还不支持 Java和Flash。相比之下,移动Flash精简版已经可以运行在Symbian操作系统上,Android版也正在开发中,而且即将推出的 Windows Mobile新版也将支持它。而Java虚拟机或J2ME也可以运行在Android、Symbian和Windows Mobile等操作系统上。

业界有一种猜测是,苹果认为,如果iPhone开始支持Java和Flash,那么可能失去对iPhone上可以运行哪些软件的控制权。

不过一名业界分析师提出了另一种看法,来自分析机构Enderle Group的首席分析师Rob Enderle表示,iPhone中所使用的ARM处理器,是阻止它支持Java和Flash的部分原因。尽管这种处理器具有低功耗的优势,不过它的性能 同样也不高。因此,无论是Flash,还是Java,都不能很好的在它上面运行。

Enderle不认同苹果故意阻碍iPhone支持Java和Flash的观点。他认为,随着iPhone处理器变得更强大,随时会增加对Java和Flash的支持。

ARM公司代表拒绝评论iPhone,不过他提到ARM处理器可以支持Flash。而Adobe公司预计在2009年下半年提供可以运行在ARM处理器设备上的Flash Player 10和Adobe AIR运行时。

iPhone开发者Christopher Allen表示,iPhone要想支持完整版Flash,其处理器可能有些力不从心。但是精简版Flash可以运行在一些低性能处理器上。

Allen认为,iPhone现在已经可以运行Java,从技术上不存在任何问题,他认为iPhone之所以没有支持Java,的确是因为苹果存在私心。

另外Allen还表示,苹果迟迟不肯让iPhone支持Java和Flash的部分原因还包括,某些运营商可能要求苹果不支持这些功能,以减轻对其网络的压力。(IT168)

The Best JSP/Struts/JSF Development Tool Is Now Free

2008年08月20日,星期三

My previous project was based on Struts 1.x. With Struts, it was always a love-hate relationships. On one end, it was elegant and it turned some of the HTML/JavaScript work into Java work, which is a plus if you’re a Java developer. On the other hand it introduced tons of XML configuration files which were a nightmare to manage. To top that, it has an incredibly steep learning curve. I used to train developers in Struts, and, IMHO, when it comes to novice developers (i.e. fresh graduates), the chances of fully understanding Struts in the first couple of months is less than 50%.

The sheer amount of XML configuration in Struts is overwhelming. I’m talking about thousands of lines. At some point, we were working with one single file, shared by a team of about 20 developers. You can imagine the chaos.

So, we started looking for a tool. I personally did a test drive on all the tools supporting Struts, including light alternatives like MyEclipse and behemoths like IBM RAD (used to be WSAD back then). There was only one tool which was acceptable in our case and it was called NitroX, developed by a small company called M7. Later on, it was acquired by BEA and renamed BEA Workshop, not to be confused with their incumbent BEA Workshop for WebLogic. The two tools were later merged and, eventually, found their way to the new owner, Oracle. It is now called Oracle Workshop for WebLogic. BTW, the only close alternative at the time was Exadel Studio, which was acquired by JBoss and became JBoss Developer Studio.

Last week, Oracle made an interesting move and decided to give it away for free (requires registration). The full workshop was an expensive piece of software, priced at up to $1000, if I recall correctly. What most people don’t realize today is that this tool includes some Oracle/BEA specific parts, but also includes generic support for Struts 1.x, JSF and Hibernate and plugins for supporting Tomcat, JBoss, Resin, Jetty, and WebSphere. It is also a great tool for JSP editing. One of the few tools which came really close to near-WYSIWYG visual editing, with customizable design-time representation for JSP custom tags.

If you’re using any of these technologies, I suggest you check it out. I haven’t tried all the features, but I know that the Struts/JSF/JSP support is as good as it gets. It currently officially supports only Windows and Linux and can be downloaded here. It is a true hidden gem now, tucked away in the humongous Oracle web site.

From http://zvikico.typepad.com/problog