在開發JavaFX的應用之前,先了解他的執行架構,對於往後的開發品質會有極大的好處。



以下是JavaFX的架構圖,描述不同Layer之間的連結順序。架構圖內包含高效能圖形引擎Prism、小而有效率的視窗系統Glass、多媒體引擎、網頁引擎,雖然在實際開發應用程式時並不會直接使用到它們,但是了解它們可以使我們知道到底有什麼東西在默默的支撐著JavaFX應用程式。

JavaFX Public APIs and Scene Graph

JavaFX Public APIs and Scene Graph位於架構圖中的最上層,這層又可再詳細區分為JavaFX Public APIs和Scene Graph。

JavaFX Public APIs

在Java 8之後,JavaFX Public APIs其實就是Java Public APIs,所以JavaFX應用程式有以下幾點特色:
  • 允許使用強大的Java功能,像是泛型、註解(annotation)、多執行緒和Lambda語法
  • 開發網頁可以較容易使用其他基於JVM的語言,像是Groovy,或是JavaScript。
  • 允許Java程式設計師使用其他的語言來開發出規模更大的JavaFX應用程式。
  • 擴展原先的Java Collection函式庫,加入observable lists和maps。使得程式觀察Data Model的變化,更新對應的UI控制項。

Scene Graph

Scene Graph是建構JavaFX應用程式的起點。它如同一棵階層樹,每個單獨的元件都稱為節點(Node),表示所有可以看見的元件,換句話說就是JavaFX GUI的可見元件都包含在Scene Graph之內。每個節點都有ID、style和邊界值。且除了root節點,每個節點都有一個parent,和零個以上的child。另外還有以下功能:
  • 效果(模糊、陰影)
  • 透明度
  • 變換(位移、縮放大小、旋轉)
  • 事件處理(滑鼠、鍵盤)
Scene graph包含了基礎的圖形元件(像是矩形、文字),UI控制項、佈局容器(Layout Containers)、多媒體。它可以簡化製作圖形使用者介面所下的功夫,就連動畫也可以直接透過javafx.animation API或是XML來直接完成。

javafx.scene API允許建立或是規範以下元件的類型:

  • 節點:形狀(2D或是3D圖形)、多媒體、內嵌的網頁瀏覽器、文字、圖形控制項(如Label、TextField、Button)、圖表、群組和容器。
  • 狀態:變換(包含位置和方向)、視覺效果。
  • 效果:模糊、陰影、顏色調整。
Scene graph支援2D和3D的圖形,並且提供圖形加速管線化的功能,就是JavaFX Public APIs and Scene Graph底下的Quantum Toolkit和Prism兩層。

Quantum Toolkit

Quantum Toolkit層用來將底下的Prism和Glass Windowing Toolkit兩層綁在一起,提供給上面JavaFX Public APIs and Scene Graph層使用。

Prism

Prism層處理JavaFX場景(scenes)的渲染(包含3D渲染)工作,支援硬體和軟體渲染。支援DirectX和OpenGL渲染方式,如果執行環境並沒有可用的硬體加速功能,就會以軟體來進行渲染。對於3D圖形來說,使用硬體渲染可以有效的加速。

Glass Windowing Toolkit

Glass Windowing Toolkit是JavaFX圖形架構的最底層,負責提供原生的運算服務(可能是C/C++的程式),像是視窗管理、計時器。這層用來連接不同的執行環境與JavaFX,可以使得此層上面的層級無需考慮執行的平台(Glass toolkit之上的層級是Platform-independent,Glass toolkit與其之下的層級是Platform-dependent)。

Glass toolkit也被用來管理EventQueue(事件)。和過去Awt的作法不同,Awt有自己的EventQueue來進行事件的排程處理,但是Glass toolkit是使用系統原生的EventQueue來做事件排程;Awt和Java本身是執行在不同的Thread上,但是Glass toolkit跟JavaFX application都是執行在同一個Thread上。

Thread

一個JavaFX應用程式,會至少同時擁有下面兩個執行緒。
  • JavaFX應用程式執行緒:這對於JavaFX開發人員來說是最重要的執行緒,所有存活中(Live)的場景都必須要使用這個Thread來存取。Scene graph的元件雖然可以在不同的執行緒上建立和產生,但是一旦它成為存活中場景的一部份,就必須使用JavaFX應用程式執行緒來存取。
  • Prism渲染執行緒:顧名思義這個執行緒是用來進行Prism的渲染。
如果有使用到多媒體還會有個多媒體執行緒,用來同步最新的畫面(更新畫面時會透過JavaFX應用程式執行緒)。

補充:Pulse

脈衝(Pluse)是一個事件,若遇到動畫或是其他改變畫面畫面的動作,會通知JavaFX scene graph同步畫面的狀態(繪製畫面時會使用Prism渲染執行緒)。脈衝的速度與電腦的執行效能有關,最大值是一秒60,單位是Frames(影格)。

從JavaFX的主要架構可以知道,JavaFX主打的是他高效能的圖形介面,所以想要開發高品質的Java應用程式,JavaFX是必學的項目!