Solaris, Java, JavaFX

星期四 十二月 24, 2009

NetBeans 6.8发布

NetBeans 6.8可以下载了,它支持最新JavaFX 1.2.1的程序编辑,而且代码自动完成、提示和导航功能等都有了更佳的改进。最新的NetBeans 6.8和JavaFX SDK 1.2.1可以从Javafx.com统一下载。


除了支持JavaFX外,NetBeans 6.8还是首个支持Java EE 6的IDE,通过更少的XML配置、注解及POJOs来简化Java企业应用的开发。


其它突出的特点:


PHP:支持PHP 5.3和Symfony框架。

更紧密地集成Kenai提供了完整的JIRA支持、改进的即时消息和问题追踪集成。

C/C++程序分析: 全新的Microstate Accounting指示器和I/O使用监视器可以帮组开发人员高效分析和优化C/C++代码。

NetBeans平台: 是个优秀的Swing应用的框架,可以使程序员节约很多时间和精力,这是由于常用的菜单、工具条、键盘快捷键和窗口管理等功能都可直接使用。

下载地址 http://netbeans.org/community/releases/68/


Other links:
JavaFX Game in Application
JavaFX Center
United Kingdom citizenship Practice test
British citizenship test on iPhone
NASCAR Diecast Cars
Canadian Citizenship Test Guide
US Citizenship Test and Appilcation Guide
United States Immigration Services for Parents and Spouse
Life in the UK Citizenship and Settlement Test

星期三 十二月 02, 2009

新书简介:JavaFX本质论

再过2天就是JavaFX发布1周年了。目前学习JavaFX的书籍不算多,英文版的书主要有3本:一是Jim Weaver,Steve Chin等编写的《JavaFX Pro Platform》,二是Jim Clarke,Jim Conners著的《JavaFX:Developing Rich Internet Applications》,还有就是Gail & Peter Anderson的《Essential JavaFX》。中文版的书籍就更少了。最近,由Sun亚洲全球化中心翻译的《Essential JavaFX》已经由人民邮电出版社出版,并和英文版同步发行,中译名为《JavaFX本质论》。这是本JavaFX学习者不可多得的参考资料和教材,现在给大家介绍一下。

作者Gail & Peter Anderson是Anderson Software Group的创始人。该公司主要从事软件开发专业人员的培训工作,该公司开发的课程在业界广泛采用。《JavaFX本质论》一书是按照培训技术人员的方式编写的,因此,读者可以按照该书快速有效地学习JavaFX脚本语言。Gail Anderson在写书的时候,得到了Sun公司Octavian Tanase和Richard Bair等JavaFX 产品组核心人员的支持和帮助,所以书中的内容较能体现JavaFX的设计精神和理念,书中涵盖的程序范例和技术细节均符合JavaFX 1.2 的规范。还值得一提的是,本书是由位于北京的Sun公司亚洲全球化中心翻译校对,除了译文忠实于原文之外,还使得本书更带有“准官方”的色彩。(原文见JavaFX博客)

如书中前言所述,本书面向的读者主要是已有编程经验的开发者(但不是必须有Java经验)。如果是没有任何编程基础的读者,建议最好先阅读一些编程语言的教程,如Java,C++等。我认为JavaFX最可能的读者应是Java程序员。这不仅因为JavaFX名字中包含了Java一字,而且JavaFX的实现技术也是基于Java的,并可直接调用Java的代码。已经熟悉Java的程序员阅读JavaFX的程序有点像在读Java语言的扩展模块。另外,对C++ 程序员来说,也不难理解JavaFX的语法和概念,毕竟Java的语法基本上是从C/C++借鉴过来的。(iPhone App Citizenship

在你已熟悉了某种编程语言,再去学习新的语言,最需要了解的就是新语言的特色和语法特点。笔者觉得一种行之有效的方法就是先概览新语言的程序例子(如HelloWorld等),快速了解新语言的语法风格。有了这种感性认识之后,再具体看语言的介绍就会容易理解了。《JavaFX本质论》就是按照这样结构来安排的,所有程序示例都可从网上下载,读者可以边阅读边运行示范程序,这种方式非常适合初学者。中文版把书中的代码注释都翻译了,更加通俗易懂。

第1章主要介绍JavaFX SDK下载和NetBeans IDE。熟悉JDK和IDE(Netbeans或Eclipse)的读者,可以很快的搭建自己的JavaFX开发环境。

第2章是本书的引子,通过展现一个JavaFX吉他调音器(GuitarTuner)例程,让读者体验JavaFX的风味,并且介绍一些重要的概念,如声明式结构,JavaFX场景图(Scene Graph),绑定和动画等。这章的目的是让读者迅速了解到JavaFX可以实现什么功能,以及如何实现这些功能的。通过前两章的阅读,读者已经可在NetBeans IDE中运行一个较完整的JavaFX程序。

第3章是语法介绍,包括变量类型、运算符表达式,类和对象、函数、触发器等基本语法元素。对Java程序员来说,可以重点关注JavaFX 和Java的语法异同点。本章也是可以较快跳过的章节,并作为今后阅读和编写JavaFX程序时的参考文档。

第4和第5章主要是描述如何用JavaFX的图形对象和控件来构造用户界面(UI)。这是JavaFX特有部分,在编程中广泛应用,因此需要仔细阅读。虽然JavaFX的UI里面可以看到不少Java SWING和Java 2D的痕迹,JavaFX甚至还提供了Swing的控件Wrapper,在使用上面JavaFX还是带来了简洁和便利等优点。

第6章深入讲解了一个完整的JavaFX项目:Piano(钢琴)。读者可以领略到JavaFX的强大功能,如各种视觉效果(渐变、阴影等)、时间轴、动态布局和序列操作等等。 这个程序还展现了JavaFX如何直接调用Java的功能来丰富应用程序。

第7章是动画(animation)功能的详述。动画可以说是JavaFX区别于Java的一个重要功能。内容包括了常用的动画概念和技巧,如时间轴(Timelines), 关键帧(Keyframes), 动画插值(interpolations), 路径动画(path)和过渡切换(transition)等。

第8章是介绍图像功能,主要包括Image和ImageView两个类的用法,以及各种图像效果的解释和演示,是做‘富’客户端必不可少的功能。本章的例程也比较有意思,如图像墙,3D照片幻灯等。

第9章内容是Web Services,即JavaFX的Client如何和Server进行数据交互。在RIA中,通过Internet获取数据几乎是必备的功能。本章内容涵盖了PullParser和HttpRequest这两个主要的类,并通过例程说明如何调用Flickr的Web服务以获取相片数据。

第10章讲述了JavaFX的移动(Mobile)应用。NetBeans IDE提供了移动仿真器(emulator),可以调试JavaFX Mobile的应用。本章介绍的移动应用开发涉及了常见的问题,如运行环境检测、处理移动设备的屏幕转向(象iphone那种)、键盘输入等。书中还介绍了如何把桌面版的JavaFX程序修改成为JavaFX Mobile的程序。

总的来说, 我觉得《JavaFX本质论》是非常适合初学者的一本入门书籍,读者可以循序渐进地学习JavaFX各个方面的功能特性。对于已经了解JavaFX的程序员,也是非常好的参考手册。有兴趣的读者可以在这里阅读和下载本书的样章:

第5 章 用户界面组件 http://images.china-pub.com/ebook195001-200000/195879/ch05.pdf
��7章 动画 http://images.china-pub.com/ebook195001-200000/195879/ch07.pdf

可在各大网上书店购买,如: http://www.china-pub.com/195879 源程序下载可从作者网站(英文)下载:http://www.asgteach.com/books/javafxbook.html

星期一 十一月 16, 2009

JavaFX How-Tos

JavaFX.com的官网中刊登了一系列JavaFX程序技巧例子(How-Tos),对JavaFX学习者来说非常有参考价值的。这些例子包括了从基本概念到范例程序。该网站还按照javafx Script的功能进行了分类,使用起来很方便。

链接如下(英文):

JavaFX How-Tos

这里仅列出部分比较有用的例子:

1)绑定的说明(bindings)

2)引人注目的视效(Visual Appeal)

3)用户界面基础(Basic UI)

4)JavaFX和Swing,Java,Javascript交互方法

5) 进阶内容(淡入淡出、zoom-in、zoom-out,transition效果等)

 
笔者的吃豆人游戏联机版许愿树原型被收录在游戏类应用程序范例里面,实在感到荣幸。

相关文章:

Java调用JavaFX的方法 JavaFX的菜单实现 用Java代码调用JavaFX的功能

JavaFX博客

其它links:


US Citizenship Application
Canada Citizen Test for iPhone
Canadian Citizenship Test
iPhone App: iCitizenship - Canada

星期日 十月 18, 2009

JavaFX离线启动方法

用JavaFX语言写的程序有三种启动方式: 一是单独的应用程序(Standalone),二是使用JNLP协议的Java Web Start(JWS)方式,三是经典的Applet方式。因为JavaFX采用java运行环境,因此上述三种方式实际上对应着Java的独立程序、JWS和Applet方式。如果你能理解Java的的这三种启动方式,就不难理解如何启动JavaFX的应用了。


1. 独立的程序
在Java语言中,我们用javac来编译程序,然后用命令行

java -classpath <path> <class_name>
来启动程序,或者是jar文件的启动方式:
java -jar <jar-file>
在JavaFX语言中,可以使用javafxc编译,然后采用类似Java的命令启动程序:
javafx -classpath <path> <class_name>
通常在NetBeans中都是编译成jar文件,因此下面的方式更常用:
javafx -jar  <jar-file>


2. Java Web Start方式。
Java Web Start是启动Java程序的一种方式,它可以使应用程序通过Web浏览器来部署和启动。JavaFX在编译后本质上就是Java代码,因此,顺理成章可以通过JWS的方式下载和启动。NetBeans编译后会生成一个<项目名>.jnlp文件,如果需要部署的话,往往要修改里面的codebase属性。例如,如果你的JNLP文件要部署在Web Server的URL为 http://www.mywebsite.com/myprogram/myproject.jnlp,你的codebase应该写成

<jnlp spec="1.0+" codebase="http://www.mywebsite.com/myprogram/" href="myproject.jnlp">

如果你的程序是本地运行(脱离NetBeans环境),假定目录在C:\myprogram\myproject\中,可以写成这样,注意路径不要有C:\这样的盘符:

<jnlp spec="1.0+" codebase="file:///myprogram/myproject/" href="myproject.jnlp">
这样,在Windows操作系统中双击 myproject.jnlp 文件就可以启动程序了。这对于离线状态下运行程序比较实用。(当然,需要有JavaFX的Runtime环境支持才行。)

3. Applet方式
JavaFX程序还可以写成Applet的方式。Applet可以说是Java最原始的启动方式,启动代码可以参考NB生成的 <项目名>.html文件


相关文章: Java调用JavaFX例子 JavaFX的菜单 用Java代码调用JavaFX的功能

其它: NASCAR Diecast Cars Collections Immigration Services for Spouse Wife Husband through Marriage NASCAR Dale Earnhardt Diecast Car US Citizenship Test Questions Free Online US Citizenship Practice Test US Citizenship Application American

星期一 九月 28, 2009

在线JavaFX应用完整例子:许愿树网络版

作为富互联网应用(Rich Internet Application)的开发语言JavaFX,其主要的技术特点在Rich和Internet上,即展现丰富的客户端和强互联能力。我把前段时间编写的单机版JavaFX许愿树改成了网络版,成为了三层架构的应用。如下图,展现层是JavaFX的富客户端,中间层是Web Server和PHP程序,数据库层是MySQL。


在这个网络版许愿树的应用中,不同的人可以通过互联网在许愿树上面挂上自己的愿望星,大家看到的都是同一棵树。请你点击下面截图来试试最新联网版的许愿树,需要输入email地址,这样可以修改愿望,每个人请最多留一个愿望:

我们一起来看看程序代码。客户端的GUI部分的JavaFX代码和单机版的基本一样,已在前几篇文章中介绍了(参见文末的链接)。这个版本增加了与server通信的部分,实现上采用了JavaFX 1.2的HttpRequest类。Server的数据采用了JSON的格式(一种基于JavaScript的对象表达形式),在客户端可用javafx API提供的PullParser class来解析。(US Immigration Application forms)


首先,我们看看客户端启动后首次加载愿望星数据的代码。在Main.fx中,相关代码如下:

var parser = PullParser {
    documentType: PullParser.JSON;

    onEvent: function(event: Event) {
      var content: String;
      var name: String;
      var id: String;
      var email: String;
      var color: Integer;
      var time: String;
      var location: String;

      // This code is from http://www.javafxblogs.com
      // parse the JSON data and populate object
      if(event.type == PullParser.END_VALUE) {

        if(event.name == "name") {
          star.name = event.text;
        }
        else if ( event.name == "content" ){
          star.wish = event.text;
        }
        else if ( event.name == "id" ){
          star.id = event.text;
         }
        else if ( event.name == "color" ){
          star.whichColor = event.integerValue;
        }
        else if ( event.name == "time" ){
          star.time = event.text;
        }
        else if ( event.name == "location" ) {
          var pos = event.text.indexOf( "_" );
          var x = event.text.substring(0,pos);
          var y = event.text.substring( pos+1 );

          star.translateX = Float.parseFloat(x);
          star.translateY = Float.parseFloat(y);
        }
        else if ( event.name == "Star" ){
          star.changeStatus();
          star.onMousePressed = handleClick;

          insert star after stage.scene.content[currentIndex++];
          star = Star {};
        }
      }
    }
  }

  function getAllStar() {  // http://www.javafxblogs.com
    request = HttpRequest {
      method: HttpRequest.GET
      location: ServerConnector.serverURL1
      onInput: function(is: InputStream) {
        try {
          parser.input = is;
          parser.parse();
        } finally {
            is.close();
          }
      }
    }

    request.start();
 }
我们创建了一个PullParser的实例,用来分析JSON格式的数据(见后),然后在函数getAllStar()中,HttpRequest实例采用了GET的放式从服务器端获取幸运星的数据,代码很简单,只需要在onInput中把输入流传给parser即可。从Web服务器上传回的JSON数据格式如下,其中id是Server端数据库中唯一的标识,location是星星在窗口中的位置,color是星星的颜色编码,其它属性都比较一目了然(http://www.javafxblogs.com ) :
{
 "Star": {
   "name" : "John Smith",
   "content" : "This is a wish from http://www.javafxblogs.com",
   "id" : "2",
   "location" : "300.0_240.0",
   "time": "2009-08-21 17:38:37",
   "color": 3
 },
 "Star": {
   "name" : "Homer Simpson",
   "content" : "This is another wish from http://javafxguy.javaeye.com",
   "id" : "3",
   "location" : "288.0_238.0",
   "time": "2009-07-18 18:38:28",
   "color": 4
 }
}


当客户端从Server数据库中获得了这些星星的数据之后,就可以把之前保存的星星和愿望在树上显示出来了。在用户增加一颗愿望星星之后,客户端会把愿望的数据传到服务器保存起来,采用的是HTTP的POST方式,把相关数据发送出去。代码如下,

/*
 * ServerConnector.fx
 * @author Henry Zhang   http://www.javafxblog.com http://developers.sun.com.cn/blog/henry
 */
package wishtree;
import java.net.URLEncoder;
import java.io.*;
import javafx.io.http.*;

var baseURL = "http://localhost:8888/wishtree/";

public var serverURL1 = "{baseURL}getallstar.php";
var serverURL2 = "{baseURL}savestar.php";

public class ServerConnector extends HttpRequest {
  var star : Star = null;
  var paramString : String ;

  override var onOutput = function( os: java.io.OutputStream): Void {
        try {
            os.write(paramString.getBytes());
        } finally {
            os.close();
        }
    };

  override var onInput = function(is: java.io.InputStream) {
     try {
           var br = new BufferedReader( new InputStreamReader( is ) );
           var line: String;

           while ( ( line=br.readLine() ) != null )
           { 
             if ( (star != null) and (star.id == "")  )
                star.id = line;
            }
        } finally {
            is.close();
        }
  };

public function saveStar( s: Star ) {
  if ( s.id.length() == 0 )
    star = s;

  paramString = encode("name", s.name);
  paramString += "&{encode("id", s.id)}&" ;
  paramString += encode("location", "{s.translateX}_{s.translateY}" );
  paramString += "&{encode("content", s.wish )}";
  paramString += "&{encode("email", s.email)}" ;
  paramString += "&{encode("time", s.time)}&" ;
  paramString += encode("color", "{s.whichColor}" );

  headers = [
        HttpHeader {
            name: HttpHeader.CONTENT_LENGTH;
            value: "{paramString.getBytes().length}";
        }
       ];

  method = POST;
  location = serverURL2;
  start();
 }
}

function encode( k: String, v:String): String {
    var result = URLEncoder.encode( k, "UTF-8");
    var value = URLEncoder.encode( v, "UTF-8");
    result += "={value}"
}


服务器端的数据库和php代码都相对简单,这里就不一一介绍了,有兴趣的读者可以下载代码看看,注意README.txt的说明。


相关文章:
JavaFX的Effect功能例子:编写许愿树程序(1)
JavaFX的Effect功能例子:编写许愿树程序(2)
JavaFX的Effect功能例子:编写许愿树程序(3)
在JavaFX中的菜单
JavaFX技巧:Java调用JavaFX例子
JavaFX中菜单
Swing中调用JavaFX
纯Java代码调用JavaFX JavaFX Online Game Example


其它文章:
NASCAR Diecast Car
NASCAR Kasey Kahne Diecast Car NASCAR Diecast Car Kevin harvick NASCAR Diecast Car Jimmie Johnson
US Immigration Forms and Application
Free US Citizenship Practice Test American Citizenship Application Forms


星期五 九月 18, 2009

JavaFX中使用菜单

也许是JavaFX设计者觉得在RIA中有没有菜单无所谓,目前的JavaFX 1.2中没有提供菜单(menu)的实现。但是在实际中开发者还是时常询问怎样在JavaFX实现菜单功能,所以我决定写个JavaFX菜单的例子(更多例子可以参考 JavaFX编程网站 http://www.javafxblogs.com)。

虽然JavaFX没有直接提供菜单Menu的功能(参见javafxblogs.com),但是提供了一个SWING组件的封装类javafx.ext.swing.SwingComponent。这个类可以把SWING的组件转化成JavaFX的节点(node)并且在Stage中显示出来。
javafx blog
javafx blog

在上述代码中,我们先构建一套标准的SWING菜单条(menu bar,JavaFX中文教程 http://www.javafxblogs.com),具有两个菜单,菜单下各包含2个菜单项。这都是标准SWING中的功能,这里就不多解释了。下一步我们用以下语句来创建一个SwingComponent实例, 把SWING的菜单条包容进去: Canada Citizenship Practice Test

javafx blog

下面是程序的截图,支持快捷键Alt+1,2,3,4来激活菜单项目:


相关文章:

SWING中使用JavaFX图形组件

Java代码调用JavaFX的功能的方法

Other links:
NASCAR Diecast Racing Cars
NASCAR Diecast Cars Driver Dale Earnhardt
US Citizenship Practice Test online practice exam for naturalizaiton.

US Citizenship Application packags for applying for citizenship of American.

星期一 八月 10, 2009

JAVAFX练习和演示程序

官方网站javafx.com公布了在线学习(e-learning)的一个程序:“技术测试列车”(Tech Test Train)。简单地说,这是个JavaFX知识练习题程序,题目共分为5大类,分别代表不同方面的JavaFX知识。和常见的多项选择题不一样的是这个软件是要输入答案那种方式,所以对答题者的知识要求会更高。每个问题允许的时间只有十五秒(包括输入答案),时间还是很紧的。如果对测试结果不满意,可以去学习相关的学习资料然后再来测试,这对提升个人的JavaFX水平是较好的作用,感兴趣的读者可以乘搭这辆测试列车试一下.

另一方面,这个评测程序本身也是用JavaFX编写的,可用Java Web start启动,通过体验这个程序,你可以加深对JavaFX各种功能的理解,例如视觉效果等等。

连接:http://www.javafx.com/learn/training.jsp

Useful Links:
在JavaFX中实现菜单

Swing应用中使用JavaFX的功能

JavaFX技巧:Java调用JavaFX例子



Other Links:

NASCAR Diecast Race Driver Diecast Cars, Collectibles

Designer Handbags Citizenship Test Application

星期一 七月 06, 2009

如何在SWING中显示JavaFX的图形元素

JavaFX包含了许多功能,它们都是Java SE不具备的,如图表Charting,动画,媒体播放,RSS/Atom等,于是程序员常常讨论如何在Java中调用JavaFX的功能。笔者文章纯Java代码调用JavaFX的功能JavaFX和Java之间的互操作性对此作过专题讨论。在Stephen Chin的开源项目JFXtras最新版本中, 提供了一个JavaFX的封装类,可以在SWING应用中显示JavaFX的图性元素(动画,图表等)。这是个十分有用的功能,对广大的Java(Swing)开发人员来说是个好消息。JFXtras的源代码中包含了相关的演示程序(SceneToJComponentScene.fxSceneToJComponentTest.java)。我把这个程序修改了一下,以便说明问题。

在文中注明:转自 http://www.javafxblogs.com 作者:Henry Zhang,即可获得授权转载.


在文中注明:作者: Henry Zhang 转自 http://www.javafxblogs.com ,即可获得授权转载

在上面代码MyScene.fx中, 我们定义了一个Timeline实例来播放动画,在动画中,我们不断的使一行文本在窗口中旋转。每隔70毫秒,都会触发一次旋转角度的变化(每次5度)。为了演示在JavaFX和Java中交互数据,我们在每次更新时,从Java的静态变量中获取数据,具体代码如下:


本"JavaFX for SWING"在窗口中央旋转。如果你在输入框中输入新的句子,你会发现旋转的文字也发生了改变。你可以点击以下截图来启动一个Java Web Start的演示程序(JDK1.5以上),或者可以点击这里来观看演示的视频(需要有Windows Media Player)。


讨论
1) 在上述程序中,我们用JavaFX的代码去轮询Java的变量值,实际中这会损失比较多的性能,所以我们可以从Java代码中主动把数据变化通知JavaFX。这需要一种从Java调用javafx的技巧,可以参见本人文章:用Java代码调用JavaFX的功能http://www.javafxblogs.com/java-call-javafx-code/).
2) 在Swing程序中调用JavaFX是可行的,那么应该怎样编译和运行这样的程序呢。其实,JavaFX的功能也就是一些jar文件,因此和Java的结合方式还是比较简单的。编译的方法主要有两种,一种就是用JavaFX 的编译器javafxc来编译Java和JavaFX的代码。第二种就是用javafxc编译JavaFX代码,用javac编译java代码。运行程序的时候,我们可以选择javafxjava命令即可,可以参见本人文章:JavaFX技巧:纯Java代码调用JavaFX的例子的详细说明。

如果有什么问题,欢迎留言讨论。


星期二 六月 23, 2009

如何编写JavaFX吃豆子游戏:Pac-Man(4)

javafxblogs.com Rss_google Rss_zhuaxia Rss_xianguo 

JavaFX吃豆人游戏的第五篇文章上周已经发表。在最后的这篇文章中,详细介绍了精灵追逐吃豆人的算法。这可能是该游戏代码中最有趣的部分了。

在游戏编写时,通常需要考虑一些要素,如算法的效率、随机性、简洁度等。在文章中对这些问题都作了讨论。 在追逐算法中,程序采用了比较简单的距离优先的逼近算法。如下图所示:

Moving Ghosts

图中的红色精灵从右到左移动,当它在交叉路口时,它可以选择向上或者向左移动。如果我们把它和吃豆人之间的X/Y方向上的距离和作为一个评估指标的话,我们可以得到这样一个结论: 向左走的距离为14,向上走距离缩短为12。因此向上可以使得红精灵更加逼近吃豆人。通过计算,我们就可以知道向上是个比较好的选择。如果吃豆人吞下魔法豆,我们只需要把积分方式取负运算,就可以立刻成为一个精灵的逃离算法。网上还有许多关于算法的介绍,但作为例子,本文中仅介绍一个最简单和最易实现的算法。全文可以参考这里。点击下图可以启动完整的吃豆人JavaFX游戏:(JDK 1.5以上)

启动游戏

启动游戏

相关文章:

JavaFX应用实例、例子
用JavaFX编写的游戏Pac-Man
JavaFX实例探索教程
JavaFX特性,编程,实例,代码例子
JavaFX 1.2 程序迁移指南

JavaFX 1.2 SDK的新特性
快速升级到JavaFX SDK 1.2的方法
JavaFX吃豆人游戏的编写过程之二
JavaFX游戏吃豆人的编写过程
怎样用JavaFX编写游戏:吃豆人(Pac-Man)之四


英文文章连载:

2009年5月14日 - 2009年6月11日:
Writing the Pac-Man Game in JavaFX

星期一 六月 22, 2009

纯Java代码调用JavaFX的例子

在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的功能

星期三 六月 17, 2009

登上JavaOne的大讲台:JavaFX吃豆人游戏

从上周起,刚刚结束的JavaOne的内容可以在SDN网站下载了,链接是http://developers.sun.com/learning/javaoneonline/。其中有关JavaFX专题的讲座在“Rich Media Applications and Interactive Content”类别中,需要注册一个Sun Developer Network(SDN)的帐号才能看到这些PDF文件。

JavaOne的演讲者之一Stephen Chin告知,我写的JavaFX Pac-Man(吃豆人)游戏在他的两个讲座中都作了现场演示,取得了巨大成功。这个游戏是Jim Weaver提出的一个挑战,他希望我把Pac-Man游戏改写成WidgetFX的widget,Stephen也答应在JavaOne上demo。虽然只有不够一周的时间,但好在WidgetFX的API比较易用,所以我仅用了2天的业余时间就完成了。虽然因工作关系不能亲临JavaOne,但自己写的JavaFX游戏能登上大讲台,也是件令人高兴的事。

JavaOne 吃豆人游戏演示 JavaOne 吃豆人游戏演示

这两个JavaOne演示吃豆人游戏的讲座是:
Pro JavaFX Platform: RIA Enterprise Application Development with JavaFX Technology
Getting Started with WidgetFX: Open-Source Widget Desktop Platform with JavaFX Technology

相关文章:
JavaFX吃豆人游戏编写过程详解(英文)
JavaFX吃豆子游戏编写过程(中文)

星期一 六月 15, 2009

JavaFX 1.2 程序代码迁移指南

javafxblogs.com Rss_google Rss_zhuaxia Rss_xianguo

本文系本人经原作者Stephen Chin授权翻译,英文原文:The Definitive 1.2 Migration Guide,为方便起见,英文原文的副本也可参见转载(http://www.javafxblogs.com/javafx-12-migration-guide/)。有关代码迁移和JavaFX 1.2新特性内容,还可以参考JavaFX.com网站的文章,或者本人文章JavaFX 1.2的新特性。以下译文中的红字部分为译者加注。


本文包含了从JavaFX 1.1迁移程序到JavaFX1.2最常见的变化,例如如语言本身、功能以及API的改变。如果你发现本文没有提到的变化,请在评论中留言。

基本原则 JavaFX教程、实例、Demo
1) JavaFX 1.2 的二进制不兼容性:对于原来的jar文件或者其它第三方的JavaFX库,如JFXtras,必须经过重新编译才能在和JavaFX 1.2的代码兼容,否则会有编译错误。JFXtras将发布基于JavaFX 1.2的更新,新的版本就快就绪了。
2)内部的API将不能用了,如果你的代码包含了impl_或者sun.com的包,你的代码肯定需要修改。
3) 支持Linux和Solaris, 这是应该说是个新功能,这样你可以对用户自豪的宣称支持Linux。译者注:这里的Solaris应指OpenSolaris。

语言上的变化 JavaFX编程实例
1)嵌套的块语句中不可以再有变量屏蔽(Shadowing)。原来可以有同名的变量分别处于内层和外层的块语句中,在内层的语句中的变量可以覆盖外层的同名变量。在JavaFX 1.2种,需要修改变量的名字来避免重名。
2)用mixin代替多类继承性。JAVAFX不再支持多类继承性,但是你可以继承一个类和多个mixin类。Mixin就像java中的interface,不同的是它可以有变量和已实现的方法,使得所有子类都可以使用。这点需要的修改也不多,只需要把原来多继承的类加上mixin关键字即可,如: 升级到JavaFX 1.2的简便方法

public mixin class Resizable { /* variables and functions here */ }
译者注:mixin也可以理解成可以多继承的抽象类(abstract class)

3) 在Sequence中,需要用逗号来分隔元素(除了那些用花括号结束元素)。这有点不方便,但实际上是件好事,因为可以避免以前很难追查的语言陷阱。JavaFX 1.2的新特性

Node类的变化 JavaFX编程实例

转载自www.javafxblogs.com
6) Container中的新函数帮助实现布局(layout)。Container类里面有很多新函数,使得很容易来使用新的布局系统。切记要先完全读一遍,因为这样可以使你节约时间,同时可以遵循布局的最佳实践。 JavaFX Game Demo
7) 不同的变换(transformation)顺序。过去transforms[]变量可让你在layoutBounds中使用变换,而scaleX/translateX/rotate等可以作用在布局之后. 现在transforms[]和transformation变量都统一在布局之后进行计算。

Skin/Control的变化: JavaFX技术应用编程交流
1) Skin.scene -> Skin.node。这个属性名称的变化可以减少易混淆的Scene类所带来的困惑。

2)去掉了Skin.computeXXX的方法。曾经有过一系列的computePreferredWidth/Height等方法,现在可直接用getPrefWidth/Height等函数,参见上文提到的Resizable类。
转载自www.javafxblogs.com
动画(Animation)的变化: JavaFX教程、例子、编程论坛
1) Transition.interpolate -> Transition.interpolator。属性名称的改变,使得interpolate标志具有新的含义:可以成为是否做插值运算的开关。
2)Transition现在是继承Timeline类。这是个受欢迎的修改,使得Transitions很容易与Timelines一起使用。因为这个变化,ParallelTransition和SequentialTransition类现在可以有一个sequence保存的Timeline实例。 译者注:这个变化比较有意义,因为原来的Transition也可以作为动画的一种机制,容易令人糊涂。
译者注:以下两点从javafx.com中摘录翻译。
3)KeyFrame中不再提供timelines变量,但是可以用ParallelTransition和SequentialTransition这两个类来实现同样的功能。
4)Transition类中的timelineDirty变量由markDirty()方法替代。

和Java相同的函数: JavaFX Discussion Blog
1)java.lang.Math -> javafx.util.Math。新的JavaFX数学函数库, 使用JavaFX数学库的好处是可以在移动设备上应用(包括pow, log, 等)。
2)java.lang.Properties -> javafx.util.Properties。和Java相似的又一个类,但是可以移植到移动设备上。但需要注意的是,JavaFX的属性文件和Java属性文件格式不一致。

(注:由于内容较多,完整的JavaFX 1.2编程变化可参见 JavaFX 1.2 程序迁移指南)

星期一 六月 08, 2009

升级到JavaFX 1.2的快速方法

javafxblogs.com Rss_google Rss_zhuaxia Rss_xianguo

JavaFX 1.2给我们带来了许多功能和性能上的提升,因此,我需要对原来的JavaFX 1.1的IDE和SDK进行升级来使用JavaFX 1.2的新特性。对于从来没有使用过JavaFX的用户来说,安装JavaFX SDK 1.2应该很简单,可以从javafx.com下载一个NetBeans 6.5.1+JavaFX 1.2 SDK混合包,那就OK了。可是对于我这种已经使用NB 6.5.1和JavaFX 1.1.1的用户,就需要考虑一些其它问题。因为我有不少程序是按照JavaFX 1.1的API写的,骤然升级可能会使得无法使用这些程序。同时由于两个SDK的IDE版本都是NetBeans 6.5.1,重新安装一遍也太浪费空间和时间,于是我查阅了一些资料并找到了快速升级的方式,同时还可以保留两个版本的SDK。

如果需要同时支持2个版本的JavaFX SDK,可以在升级前先把旧版本备份一下,这样可以避免被新的SDK覆盖。JavaFX SDK 1.1的缺省目录在C:\Program Files\NetBeans 6.5.1\javafx2\javafx-sdk,把它拷贝到另外一个目录,如C:\jfxsdk11\ 。

接下来就是升级了。在NB6.5.1 中,选择菜单Tools-〉Plugins,这时会列出一些可更新的plugin,如果没有看到列表,可以点击“Reload Catalog”按钮。如果plugin太多,可以在Search框中输入JavaFX过滤一下。有3个Plugin和JavaFX相关:

Plugins    说   明
JavaFX Kit     改进过的NetBeans IDE, Version 1.8
JavaFX SDK for Windows     JavaFX SDK 1.2, Versions 1.7
JavaFX Weather Sample     JavaFX演示程序, Versions 1.7

其中前面两个plugin是必需的,演示程序可自己决定取舍。选择安装之后,需要重新启动NetBeans。重新启动后,新的JavaFX SDK 1.2就安装完成了。如果要配置JavaFX 1.1的环境,则可以在菜单Tools->Java Platforms中配置。点击“Add Platform...”按钮添加平台,下一步中再选择JavaFX平台,输入平台名称如"Java SDK 1.1",平台文件夹中输入刚才备份的目录C:\jfxsdk11\,点击"结束"即可。系统可能会有一个不支持之类的警告,但是不用理会。

如果你的项目需要使用JavaFX 1.1,可在项目的属性(右键点击该项目,选Properties)中配置libraries(库),可以选择JavaFX平台。这样,在同一个NetBeans IDE中就可以同时使用两个JAVAFX SDK环境了。当然,如果你没有太多JavaFX 1.1的程序,或者现有的程序和JavaFX 1.2兼容,那就基本上没有必要配置两个SDK版本了。

在用JavaFX 1.2重新编译了原来的程序后,发现JavaFX1.2的性能提升了不少。原来我用JavaFX 1.1写的吃豆人游戏,要占用50%左右的CPU利用率,现在只需要10-20%,进步还是比较明显的。所以建议尽可能使用JavaFX 1.2。

相关文章:
JavaFX吃豆人游戏的编写过程之三 JavaFX 1.2的新特性 JavaFX吃豆人游戏的编写过程之二 JavaFX游戏吃豆人的编写过程

英文文章连载:
第一篇文章,2009年5月14日:
Writing the Pac-Man Game in JavaFX - Part 1
第二篇文章,2009年5月21日:
Writing the Pac-Man Game in JavaFX - Part 2
第三篇文章,2009年5月28日:
Writing the Pac-Man Game in JavaFX - Part 3
第四篇文章,2009年6月4日:
Writing the Pac-Man Game in JavaFX - Part 4

星期日 六月 07, 2009

如何编写JavaFX吃豆子游戏:Pac-Man(3)

javafxblogs.com Rss_google Rss_zhuaxia Rss_xianguo

本周发表了英文连载中的第4篇文章。在这篇文章中,主要介绍了吃豆人和精灵之间互动的代码实现。本程序的代码可以在该文章中下载,或者在“JavaFX游戏实例共享网站”中下载。

到上一篇文章为止,我们已经实现了游戏中所有的人物。现在我们来增加吃豆人和精灵追逐和互“吃”的处理逻辑。如果吃豆人和精灵相遇,只有两种情况,吃豆人吃掉精灵或者反之。如果吃豆人刚刚吞吃了魔法豆,他可以吃掉精灵,否则吃豆人就会损失一条命,这时,需要播放一段吃豆人消失的动画(如下图所示):JavaFX应用实例、例子 JavaFX Guy的博客 JavaFX 1.2的新特性
shriking pac-man

这个动画在DyingPacMan类中实现,代码如下:


在这个动画中,定义了2个KeyFrames,一个在600ms,另一个在1800ms。在这两个关键帧中采用了JavaFX的线性插值方式(Interpolator.LINEAR)。线性插值的作用就是把动画中数据按照时间关系,在帧与帧之间线性变化,从而实现平滑的动画效果。在上述代码中,Arc类的两个实例变量:startAnglelength, 通过线性的均匀变化,实现了我们需要的动画过程。参考下图的时间轴。第一个关键帧的时间是600ms而不是0ms,是因为我们希望游戏在这瞬间稍微停顿600ms。
timeline pac-man

好啦,到目前为止,游戏已经基本完成了,可以玩了。唯一不足就是精灵现在还是随机移动的,游戏的难度不大。不要紧,我们将在下周的文章中详细讨论。现在就点击下图来试一下这个游戏吧:(JDK1.5以上, Java Web Start 自动启动)

点击启动

点击启动


相关文章:
JavaFX 1.2的新特性
怎样用JavaFX编写游戏:吃豆人(Pac-Man)
JavaFX吃豆人游戏的编写过程之二
JavaFX游戏吃豆人的编写过程

星期一 六月 01, 2009

JavaFX SDK 1.2 新特性

尽管JavaFX SDK1.2版本还未正式发布,但是已经可以在javafx.com下载了(显示是下载SDK1.1.1版本,实际是SDK1.2)。

JavaFX 1.2在功能上和API上都有了较大的提高,需要注意的是,对先前写成的JavaFX 1.0/1.1的代码,可能需要做迁移和语法修正,二进制代码也是不兼容的(即需要重新编译)。JavaFX SDK 1.2主要的新功能如下:http://developers.sun.com.cn/blog/henry


0) EA(Early Access)版对OpenSolaris和linux的支持
1)包括20多种BoxBlur等新效果(effect)
2)图表(Charting)功能(饼图,柱状图、散点图等)
3)Mixin类替代了多继承性  http://developers.sun.com.cn/blog/henry
4)Java数组的直接引用(无需通过Sequence的转换)
5)异步的处理模式(Asynchronous Processing Model)
6)内置的数学和属性类(即JavaFX写的Math,Properties类)
7)更多新的Layout类
8)更多的Skinnable控件   JavaFX实例和编程演示
9)RSS和Atom流的支持
10)Stage的支持功能,如Screen,Alerts等
11)本地数据存储,可以支持会话状态的保存。
12)客户化UI控件的增强支持(Behavior类等)
JavaFX 1.2新特性  JavaFX 1.2的新特性
JavaFX实例应用例子
NASCAR Diecast and Drivers
Online US Citizenship Practice Test
Online Canada Citizenship Practice Test

Calendar

Feeds

Search

Links

Navigation

Referrers