Strict Standards: Declaration of Walker_Page::start_el() should be compatible with Walker::start_el(&$output) in /home/citiz68/public_html/javafxblogs/wp-includes/classes.php on line 596

Strict Standards: Declaration of Walker_Page::end_el() should be compatible with Walker::end_el(&$output) in /home/citiz68/public_html/javafxblogs/wp-includes/classes.php on line 596

Strict Standards: Declaration of Walker_PageDropdown::start_el() should be compatible with Walker::start_el(&$output) in /home/citiz68/public_html/javafxblogs/wp-includes/classes.php on line 613

Strict Standards: Declaration of Walker_Category::start_lvl() should be compatible with Walker::start_lvl(&$output) in /home/citiz68/public_html/javafxblogs/wp-includes/classes.php on line 707

Strict Standards: Declaration of Walker_Category::end_lvl() should be compatible with Walker::end_lvl(&$output) in /home/citiz68/public_html/javafxblogs/wp-includes/classes.php on line 707

Strict Standards: Declaration of Walker_Category::start_el() should be compatible with Walker::start_el(&$output) in /home/citiz68/public_html/javafxblogs/wp-includes/classes.php on line 707

Strict Standards: Declaration of Walker_Category::end_el() should be compatible with Walker::end_el(&$output) in /home/citiz68/public_html/javafxblogs/wp-includes/classes.php on line 707

Strict Standards: Declaration of Walker_CategoryDropdown::start_el() should be compatible with Walker::start_el(&$output) in /home/citiz68/public_html/javafxblogs/wp-includes/classes.php on line 730
JavaFX : JavaFX技巧

JavaFX常用技巧( How-Tos )

分类: JAVAFX技术, JavaFX技巧, JavaFX编程.
标签: ,

Javafx.com中发布了一组实用的编程技巧例子,非常有参考意义。内容从最基础的概念到示范程序都有,另外还按照常见的API调用分类说明,对入门、初级和中级JavaFX学习者都是很好的借鉴。

链接如下:


JavaFX How-Tos (英文)

比较重要或者有意思的内容有:

1)绑定(binding)

2)基础UI(Basic UI)

3)视觉效果(Visual Appeal)

4) 近阶内容(transition切换等)

5)JavaFX和Java,Javascript,SWING交互



本人的Pac-Man和WishTree程序被收录在Game应用程序范例里面,实在感到荣幸。




Other links:


iPhone App Canada Citizen Test
Canadian Citizenship Test for iPhone
Canadian Citizen Exam
iPhone App iCitizenship Canada

评论 (0) 2009年11月14日

在SWING中使用JavaFX的组件

分类: JAVAFX技术, JavaFX技巧.
标签: , ,

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


自从JavaFX推出以来,如何在Java中调用JavaFX的功能就是个程序员常常讨论的问题。本人的文章用纯Java代码调用JavaFX的功能JavaFX和Java之间的互操作性对此作过专题讨论。在开源项目JFXtras最近

JavaFX的代码,只有了解它的作用即可: ( 转自http://www.javafxblogs.com 作者:Henry Zhang )

/*
 * MyScene.fx     http://www.javafxblogs.com
 * @author  Henry Zhang
 */

package swingtest;

import javafx.scene.Scene;
import javafx.scene.text.*;
import javafx.scene.paint.*;
import javafx.scene.shape.Rectangle;
import javafx.animation.Timeline;
import javafx.animation.KeyFrame;

def w = 500;
def h = 400;

public class MyScene extends Scene {
    var xx = w / 3;
    var yy = h / 2;
    var rotate = 0;
    var text = "";
    var tl = Timeline {
      repeatCount: Timeline.INDEFINITE
      keyFrames : [
        KeyFrame {
          time: 70ms
          action: function() {
             text = JavaFXToSwingTest.tf.getText();
             rotate = (rotate+5) mod 360;
          }
        }
      ]
     }

     override var content = [
        Rectangle {
            width: w, height: h
            fill: Color.BLUE
        },
        Text {
            font : Font {
                    size: 24
                   }
            layoutX: bind  xx
            layoutY: bind yy
            rotate: bind rotate
            content: bind text
            fill: Color.YELLOW
        }
    ];

    init { tl.play(); }
}


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


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


text = JavaFXToSwingTest.tf.getText();


虽然这不是最佳的一种做法,但是我们暂时写成这样,使得不熟悉JavaFX的读者也能容易理解。稍后我们还会讨论这点。当我们完成了MyScene类后,可以开始写Java的主程序了,这是个标准的SWING程序JavaFXToSwingTest.java代码如下: ( 作者: Henry Zhang 转自 http://www.javafxblogs.com


package swingtest;

/**
 * JavaFXToSwingTest.java     http://www.javafxblogs.com
 * @author Henry Zhang
 */
import java.awt.*;
import javax.swing.*;
import org.jfxtras.scene.SceneToJComponent;

public class JavaFXToSwingTest extends JFrame {

  public static JTextField tf = new JTextField("JavaFX for SWING");

  public JavaFXToSwingTest() {
    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    setTitle("JavaFX in SWING Test");

    Container container = getContentPane();
    container.setLayout(new BorderLayout());

    String sceneClass = "swingtest.MyScene";
    JComponent myScene = SceneToJComponent.loadScene(sceneClass);

    JLabel label = new JLabel(" Below is a JavaFX Animation: ");
    container.add(label, BorderLayout.NORTH);
    container.add(myScene, BorderLayout.CENTER);

    JPanel p = new JPanel();
    p.setLayout(new FlowLayout());

    tf.setColumns(28);
    p.add(tf);
    p.add(new JButton("SWING Button"));

    container.add(p, BorderLayout.SOUTH);
    pack();
  }

  public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(
      new Runnable() {
        public void run() {
          new JavaFXToSwingTest().setVisible(true);
        }
      });
  }
}


对大多数Java/Swing的程序员来说,上述代码应该是很容易理解的。我们通过 BorderLayoutFlowLayout在Swing的窗口(JFrame)中布置了一些图形控件。有2行代码是和加载JavaFX的Scene相关的:

    String sceneClass = "swingtest.MyScene";
    JComponent myScene = SceneToJComponent.loadScene(sceneClass);


其中SceneToJComponent类是从JFXtras项目中来的。它提供了loadScene()的方法,可以把JavaFX的Scene类加载到一个JComponent对象中, 从而可以被Swing程序使用。运行这个程序,你可以看到一行文本”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的例子的详细说明。


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


评论 (0) 2009年07月06日

用纯Java代码调用JavaFX的功能

分类: JavaFX技巧, JavaFX编程.
标签: , , , ,

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

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的图表(charting)功能。我们首先用JavaFX reflection API生成JavaFX类的实例。然后我们再通过java的interface来使用它。因此,我们先定义一个Java的interface:

/*
 * JavaInterface.java
 *
 * @author Henry Zhang      http://www.javafxblogs.com
 */
package javatest;
public interface JavaInterface {
  public void addData(String name, float data);
  public void showChart();
}

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

/*
 * MyChart.fx
 *
 * @author Henry Zhang     http://www.javafxblogs.com
 */
package javatest;

import javafx.scene.chart.PieChart;
import javafx.scene.Scene;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.scene.chart.PieChart3D;

public class MyChart extends JavaInterface {
  var chartData :  PieChart.Data[] = [];

  public override function addData( l:String, v: Number):Void {
    var labelString = l;

    var data =  PieChart.Data {
      label : l
      value : v
      action: function() {
        println("{labelString} clicked!");
      }
     } ;

    insert data into chartData;
  }

  public override function showChart() : Void {
    var chart =
      PieChart3D {
        data : chartData
        pieThickness: 25
        pieLabelFont: Font{ size: 9 };
        pieToLabelLineOneLength: 10
        pieToLabelLineTwoLength : 20
        pieLabelVisible: true
        pieValueVisible: true
        translateY: -50
     };

    Stage {
      title: "PieChart Window"
      width: 520
      height: 300
      scene: Scene {
        content: [
          Text {
            font : Font {
                    size : 16
                   }
            x: 200
            y: 20
            content: "Pie Chart"
          },
          chart
        ]
      }
    }
  }
}

最后就是从java类JavaTest中调用图表功能:

/*
 * JavaTest.java
 * @author Henry Zhang    http://www.javafxblogs.com
 */
package javatest;

import javafx.reflect.FXClassType;
import javafx.reflect.FXLocal;
import javafx.reflect.FXLocal.Context;
import javafx.reflect.FXLocal.ObjectValue;

public class JavaTest {
  public static void main(String args[]) {
    Context context = FXLocal.getContext();
    FXClassType instance = context.findClass("javatest.MyChart");
    ObjectValue obj = (ObjectValue)instance.newInstance();

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

    String [] labels = {"January", "Febuary", "March", "April"};
    int [] values = { 18, 20, 25, 37 };

    for ( int i=0; i < values.length; i++ ) {
      ji.addData(labels[i], values[i]);
    }

    ji.showChart();
  }
}

在代码中,这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

在命令行中可以采用以下方式:

   javafx -jar javatest.jar

实际上,可以用纯Java的方式来启动程序,只要把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.

评论 (1) 2009年06月21日

JavaFX 多维数组的使用

分类: JAVAFX技术, JavaFX技巧, JavaFX编程.
标签:

JavaFX的sequence是与java中的数组类似的一种数据结构。sequence使用起来比数组灵活,例如可以支持元素的插入和删除,应该说更像Collection这样的数据结构。和数组明显不同的是,sequence不支持多维结构。因此,当我们需要使用多维数组时,可以在Java语言中定义一个多维数组,然后在JavaFX中调用。


下面是一个包含2维数组的Java程序:

/**
 *
 * @author Henry Zhang
 * JavaFX技术应用 http://www.javafxblogs.com
 *
 */
public class ArrayClass {

  public static int arr [ ][ ] = new int[2][2];

  static {
    for ( int i=0; i<2; i++)
      for ( int j=0; j<2; j++ )
        arr[i][j] = i+j;
  }
}


在JavaFX中我们可以这样调用:

var x = ArrayClass.arr;

for ( i in [0..1] )
  for ( j in [0..1] )
    println("array[{i}][{j}] = {x[i][j]}");


输出结果如下:


array[0][0] = 0
array[0][1] = 1
array[1][0] = 1
array[1][1] = 2


JavaFX 技术应用
JavaFX技术交流应用中心

评论 (0) 2009年05月09日