2014年1月24日 星期五

JavaFX Tutorial

JavaFX 1.X是以JavaFX Script的形式撰寫程式,其副檔名為fx:


import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.text.Text;
import javafx.scene.text.Font;

Stage {

  title: "First JavaFX"
  width: 250
  height: 80
  scene: Scene {
    content: Text {
      font: Font {
        size: 16
      }
      x: 10,
      y: 30
      content: "Hello World - JavaFX"
    }
  }
}


接著以JavaFX編譯器 (javafxc.exe) 編譯JavaFX Script,由於JavaFX 1.X同時支援桌上型應用程式 (Desktop Profile) 與手機應用程式 (Mobile Profile),因此其編譯方式可分為:
  • 預設方式javafxc *.fx
  • 桌上型應用程式javafxc -profile desktop -d desktop *.fx
  • 手機應用程式javafxc -profile mobile -d mobile *.fx
執行JavaFX類別,則以JavaFX直譯器 (javafx.exe) 執行類別檔案,執行方式亦可分為:
  • 預設方式:javafx JavaFXApplication
  • 顯示啟動圖像:javafx -splash:spash.jpg JavaFXApplication
  • 桌上型應用程式:javafx -profile desktop JavaFXApplication
但由於JavaFX Script與傳統Java差異甚多,開發人員需花費較多的時間學習,也因此JavaFX Script並未受到很大的重視。

至JavaFX 2.0,Oracle將JavaFX重新改寫,以Java語法取代原JavaFX Script語法與移除支援手機的Mobile版本,並正式併入Java S.E. 7 Update 6中,將原有的JavaFX編譯器 (javafxc.exe) 與直譯器 (javafx.exe),以Java編譯器 (javac.exe) 與直譯器 (java.exe) 取代,因此可使用同一個編譯器編譯Java與JavaFX程式。

開發JavaFX應用程式需繼承javafx.application.Application抽象類別,Application抽象類別類似於Java Swing的JApplet類別,同樣有其「生命週期」,分別為:
  • init():初始化JavaFX應用程式。
  • start():為JavaFX應用程式的進入點,在此為Java Applet。
  • launch():啟動獨立 (Standalone) 的JavaFX應用程式,在此為視窗程式。
  • stop():當JavaFX應用程式結束之前,將執行stop()方法。
其程式架構如下:


import javafx.application.Application;

import javafx.scene.Scene;
import javafx.stage.Stage;
...

// 繼承javafx.application.Application抽象類別

public class JavaFXHelloWorld extends Application {

  @Override

  public void start(Stage primaryStage) {
    ...
  }

  public static void main(String[] args) {

    launch(args);
  }
}



JavaFX同樣以main()方法為進入點,但由於JavaFX可同時以視窗程式、Java Applet或以Java Web Start啟動等形式執行,因此其程式架構類似Java Swing,但較為精簡。由於視窗程式是以main()方法為進入點,因此在main()中執行Application抽象類別的launch()方法,啟動獨立的JavaFX應用程式,則以視窗的形式執行;若是以Java Applet形式執行,則將不會執行main(),而是由Application抽象類別的start()方法開始,因此上述的程式架構可同時滿足視窗程式、Java Applet與以Java Web Start啟動等形式,一舉數得。

請參考以下範例:


import javafx.application.Application;

import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.scene.text.Text;
import javafx.scene.Group;

// 繼承javafx.application.Application抽象類別

public class JavaFXHelloWorld extends Application {

  @Override

  public void start(Stage primaryStage) {

    Text text = new Text("("JavaFX Hello World");

    text.setX(50);
    text.setY(50);

    Group group = new Group();

    group.getChildren().add(text);

    // 設定Scene的Layout Pane

    Scene scene = new Scene(group);
    // 設定Stage的標題
    primaryStage.setTitle("JavaFX Hello World");
    // 設定Stage的寬度
    primaryStage.setWidth(250);
    // 設定Stage的高度
    primaryStage.setHeight(200);
    primaryStage.setScene(scene);
 
    // 顯示Stage
    primaryStage.show();
  }

  public static void main(String[] args) {

    launch(args);
  }
}



JavaFX以樹狀架構的方式組合物件,如同分層堆疊一般,各樹狀節點稱為Node,分為以下三類:
  • Root:最上層的容器。
  • Parent:置放物件的容器。
  • Leaf:容器中的物件。
其中javafx.stage.Stage為JavaFX最上層的容器 (Container),類似於Java Swing的JRootPane類別,用以置放Scene物件。javafx.scene.Scene則是JavaFX Scene Graph,可藉以繪圖或配置各類GUI物件。

程式完成之後,同樣以Java編譯器 (javac.exe) 與直譯器 (java.exe) 編譯JavaFX程式與執行類別檔案。

【參考資料】

[1] 黃嘉輝,深入研究JavaFX 2。
[2] 黃嘉輝,深入研究Java Swing。
[5] NetBeans: http://netbeans.org
[7] JavaFX 2.2 API Specification.
[8] Java Platform, Standard Edition 7 API Specification.

© Chia-Hui Huang

沒有留言:

張貼留言