JavaFX學習之道:詳解JavaFX架構與框架

JavaFX 2.0平臺是基於Java技術的富客戶端平臺。它使應用程序開發者更加容易的開發和部署跨平臺的富互聯網應用(RIA)。JavaFX 2.0文檔包含了JavaFX 2.0所提供的功能的概述。

圖1描述了JavaFX 2.0平臺的架構組件。後面的部分將對每一個組件進行逐一的描述。在JavaFX通用API的下面是用來運行JavaFX代碼的引擎。這個引擎包括以下子組件:JavaFX高性能圖形引擎(Prism);新的更小但更有效率的窗體系統(Glass);媒體引擎和Web引擎。雖然這些組件不是包括在外的,但是他們的描述能幫助你更好地理解JavaFX應用是如何運行的。

 

JavaFX 2.0 架構圖

 

圖1 JavaFX 2.0 架構圖

場景(Scene Graph)

JavaFX的場景(Scene Graph)是JavaFX應用程序創建的開始點。它是一棵層次樹,其每個節點都代表了一個應用程序UI的視覺元素。它可以處理輸入並被渲染。

在場景中的一個元素叫做節點(node)。每個節點都有其ID,樣式類別和包圍盒(不熟悉計算機圖形學.....原文爲bounding volume,我挺想翻譯爲基準線或者輪廓線的)。在場景中的每個節點都有一個唯一的雙親節點和零到多個孩子結點。一個節點還可以包含:

◆ 效果(Effect),比如模糊或陰影效果

◆ 透明

◆ 變換

◆ 事件處理(比如鼠標、鍵盤或其他輸入方式)

◆ 應用程序定義的狀態

不同於Swing或者AWT,JavaFX的場景除了包含控制、佈局管理器、圖像和媒體外,也有基本圖元,如矩形或者文字。

對於大多數用戶來說,場景簡化了用戶實現UI的工作,特別是用戶實現富UI的時候。在場景中繪製各種圖形可以被快捷地完成,而且可以使用如XML文檔一樣的聲明式方法。

javafx.scene API允許創建和定義許多種內容,如:

◆ 節點(Nodes):2D或者3D的圖形、圖像、媒體、嵌入式web瀏覽器、文字、UI控件、圖標、組和容器。

◆ 狀態(State):變換(節點的位置和方向),視覺效果和其他內容的視覺狀態。

◆ 動畫(Animation):場景對象在一段時間中的屬性變化

◆ 效果(Effects):可以修改場景節點的外觀,如模糊、陰影和顏色調整。

你可以從Working with the JavaFX Scene Graph文檔獲取更多的信息。

爲實現JavaFX特徵提供的Java API

如圖1中的最頂層顯示的那樣,JavaFX 2.0平臺包括一組完整的公共API。這些API爲創建富客戶端應用提供無可比擬的自由度和靈活性。JavaFX平臺將Java平臺的如身臨其境般的媒體功能融入直觀的一站式綜合開發環境之中。這些新的Java API實現了JavaFX的以下特點:

◆ 允許使用強大的Java語言特徵,如泛型、註解和多線程技術

◆ 對於Web開發人員,JavaFX提供使用動態語言編寫方式,如使用JRuby、Groovy和JavaScript

◆ 允許Java開發人員使用其他的系統語言去編寫龐大複雜的JavaFX應用,如Groovy

◆ 允許使用與JavaFX腳本語言類似的綁定機制(binding)。這包括提供高性能的延遲綁定機制,綁定表達式和序列表達式,部分綁定重求值(不理解....)。其他語言(如Groovy)可以使用如JavaFX腳本語言一樣的綁定庫來實現語法級別的綁定。

◆ JavaFX擴展了Java集合庫,加入了observable lists和maps。這允許應用程序將UI和數據模型進行連接,UI可以觀測數據模型的改變並進行直接更新。

JavaFX 2.0 API和編程模型是JavaFX 1.x的延續。大部分JavaFX API都與Java直接相連。一些API已經根據JavaFX 1.x使用者的反饋進行了更新(包括性能和易用性的提升),如佈局管理(Layout)和媒體(Media)。而且JavaFX 2.0更加支持Web標準,如可以使用CSSS作爲樣式控制和使用無障礙規範建立ARIA。更多的Web標準也正在審覈之中。

圖形系統

在圖1中用藍色的部分是JavaFX圖形系統。它是JavaFX場景層的下層細節實現。它爲2D和3D的場景提供支持。當系統的圖形硬件設備無法支持硬件渲染的時候,它提供軟件渲染支持。

在JavaFX平臺上實現了兩個圖形加速管道:

Prism:Prism處理渲染工作。他的渲染工作,包括3D渲染,都可以運行在硬件和軟件渲染單元之上。它負責處理光柵和渲染JavaFX場景。基於所使用的設備的不同,可能有以下的渲染途徑:

◆ 在Windows XP和Vista下使用DirectX 9

◆ 在Windows 7下使用DirectX 11

◆ 在Mac,Linux,嵌入式系統上使用OpenGL

◆ 如果硬件加速不可用,使用Java2D

如果可用時,所有的硬件加速途徑都將被使用。但如果不可用,Java2D渲染途徑將被使用。這是由於該渲染技術已經包含在JRE中。這可能在進行3D場景處理時很重要,但是一旦硬件渲染途徑可用,性能就會比較好。

l Quantum Toolkit:Quantum Toolkit將Prism和Glass窗口工具結合在一起並使在整個JavaFX層次結構中上層組件可用。它也同時管理着與事件處理相對的渲染線程規則。

Glass窗口工具

在圖1中間所示的Glass窗口工具是JavaFX 2.0圖形棧中最底層的框架。他的主要責任是提供本地系統服務,比如說控制窗口,計時器或外觀。它作爲平臺依賴層銜接着JavaFX平臺和操作系統。

Glass工具包也爲事件隊列提供管理功能。不同於AWT管理其自身所具有的事件隊列,Glass工具包使用操作系統事件隊列去管理線程。同樣不同於AWT的是,Glass工具包與JavaFX應用運行於同一線程。而在AWT中,原生AWT運行於一個線程而Java層次運行於另一個線程。這樣會帶來許多問題,而JavaFX使用單一JavaFX線程來解決這類問題。

線程

任何時候,整個JavaFX系統都運行於兩個以上的線程:

◆ JavaFX應用程序線程(JavaFX Application Thread):這是JavaFX應用開發人員所要使用的主要線程。任何“活着的”場景(指場景是窗口的一部分)都只能從這個線程訪問。然而,場景也可以從後臺線程創建,這使得開發人員可以從後臺線程創建複雜的場景而同時保證“活着的”場景中的動畫平滑而快速地播放。JavaFX應用程序線程與Swing或AWT得事件派發線程(EDT)不同,所以當把JavaFX代碼嵌入Swing應用中時,必須格外當心。

◆ Prism渲染線程(Prism Render Thread):這個線程只處理渲染工作,而不干預事件派發線程。它允許第N幀播放時的同時,N+1幀正在被處理。這種能力對於提高併發處理能力有着極大地好處,尤其是在現代的多處理器系統中尤爲出色。Prism渲染線程也可以開啓多個光柵線程去幫助分擔渲染工作。

◆ 媒體線程(Media Thread):這個線程運行於後臺並通過JavaFX應用程序線程所使用的場景來同步最新的幀。

脈搏(Pulse)

脈搏(Pulse,先這麼翻譯吧,等官方翻譯出來再修改,其本質就是Repaint信號)是JavaFX應使用Prism去同步場景和場景中的元素狀態的標誌。脈搏的最大速度爲60幀/秒(FPS),而且無論何時只要場景中的動畫進行,那麼就會發送脈搏通知。即使動畫沒有進行,當場景發生改變,也會發送脈搏通知。例如,當一個按鈕的位置發生了變化,那麼就會安排一個脈搏通知。

當發送脈搏信號後,場景中的元素的狀態就會根據渲染層進行同步。脈搏可以使應用程序開發者對於事件進行異步處理。這個重要的特點使得系統可以在一個脈搏來臨前將事件進行批量處理。

佈局管理和CSS也關聯於脈搏信號。場景的衆多變化可能導致多次佈局或CSS的更新,這種更新會導致性能的降低。JavaFX系統會自動地在每次脈搏信號來臨時將CSS或佈局進行發送,從而避免系統性能下降。應用程序開發人員也可以手動觸發佈局或CSS變更通知的發送。

Glass窗口工具負責使用高性能的系統原生計時器來發送脈搏信號。

媒體與圖像

JavaFX媒體功能是通過javafx.scene.media API實現的。JavaFX提供顯示和音頻媒體功能。支持MP3,AIFF,WAV音頻文件和FLV視頻文件。JavaFX媒體功能由三個組件提供:媒體對象代表着媒體文件,媒體播放器用來播放媒體文件,媒體視圖是代表着媒體的節點。

在圖1中綠色的部分是媒體引擎組件,這部分已經在JavaFX 2.0中被完全重新設計了,增加了性能和穩定性,並提供了跨平臺一致性。你可以閱讀Incorporating Media Assets into JavaFX Applications文檔來獲取更多的信息。

嵌入式瀏覽器

JavaFX嵌入式瀏覽器是JavaFX新的UI組件,它通過API提供了Web顯示和訪問的全部功能。圖1中橙色的部分是基於WebKit的Web引擎組件(WebKit是一款支持HTML5、CSS、Javascript、Dom和SVG的開源Web瀏覽器引擎)。它使開發人員可以在他們的Java應用中實現以下功能:

◆ 渲染本地或遠程的HTML內容

◆ 支持歷史功能,並提供前進和後退導航

◆ 重新載入內容

◆ 向Web組件增加效果

◆ 編輯HTML內容

◆ 執行JavaScript命令

◆ 處理事件

這個嵌入式瀏覽器組件包括一下的類:

◆ WebEngine 提供基本的Web頁訪問功能

◆ WebView 封裝了一個WebEngine對象,可將HTML內容放入應用程序場景中,並提供域和方法來應用效果和變換。它是Node類的子類。

你可以閱讀Adding HTML Content to JavaFX Applications文檔來獲取更多的關於JavaFX嵌入式瀏覽器的細節。

CSS

在JavaFX中CSS提供了對於JavaFX中UI應用定製樣式而無需改變代碼的能力。CSS可以被異步地應用於任何JavaFX場景中的節點。JavaFX CSS樣式也可以在運行期間被簡單地賦予場景,並允許動態修改應用程序外觀。

圖2顯示了同一應用程序在兩個不同CSS樣式下的效果:

 

CSS樣式範例

 

圖2 CSS樣式範例

JavaFX CSS基於W3C CSS ver2.1版本規範與現在正在使用的ver3版本的一部分。JavaFX CSS可以使用任何CSS解析器,甚至那些不支持JavaFX擴展的部分的。這樣可以將爲JavaFX和爲其他目的(如HTML頁)所寫的CSS混合爲一個文件。由於JavaFX具有輕微不同的詞法,所有的JavaFX屬性名都以“-fx-”開頭,包括那些可兼容於標準HTML的CSS。

你可以閱讀 Skinning JavaFX Applications with CSS文章來獲取更多的信息。

UI控件

JavaFX中UI控件可以通過使用場景中的節點的API來實現。它們從JavaFX平臺的豐富的可視化特點中獲得優勢並在跨平臺時有着輕微的不同。JavaFX CSS允許爲UI控件定製主題和皮膚。

圖3顯示了一些現在支持的控件。新的控件,如TitlePane或Accordion,都將在JavaFX 2.0 SDK中被引入。這些控件位於javafx.scene.control包中。

 

JavaFX UI控件範例

 

圖3 JavaFX UI控件範例

你可以閱讀Using JavaFX UI Controls文檔和API文檔中的javafx.scene.control 包來獲取更多的細節信息。

佈局

佈局容器或窗格可被用於在JavaFX應用程序場景中動態、靈活地管理UI控件。JavaFX佈局API包括以下容器類,這些類可以自動進行佈局:

◆ BorderPane將其內容節點分佈於上、下、左、右、中間位置。

◆ HBox將其內容節點水平佈局於一行中

◆ VBox將其內容節點垂直佈局於一列中

◆ StackPane將其內容節點以從後到前的順序佈局於一個棧中

◆ GridPane允許開發人員創建靈活行列數目的格子,並在格子中存放內容節點

◆ FlowPane將其內容節點在水平方向或垂直方向上按順序佈局,並以特定寬度和高度的邊界進行包裹。

◆ TilePane將其內容節點佈局於一致大小的單元中。

◆ AnchorPane允許開發人員在上下左右或者中間創建錨節點。

在JavaFX應用中,想要實現希望的佈局效果,可以綜合使用不同的容器。

你可以閱讀Working with Layouts in JavaFX文獻或查看API中的javafx.scene.layout包來獲取更多信息。

2D和3D變換

在JavaFX場景中的每個節點都可以使用javafx.scene.transform(原文這裏應該是打錯了)進行二維座標變換:

◆ 平移變換(translate):將一個節點從一個地方根據初始位置移動到另一個地方

◆ 拉伸變換(scale):將一個節點根據縮放因子進行縮放

◆ 扭曲變換(shear):將一個節點根據不垂直的x、y軸進行旋轉。

◆ 旋轉變換(rotate):將一個節點根據場景中的某個點進行旋轉

◆ 仿射變換(affine):(若干balabala...看計算機圖形學教材吧...)該變換不應被直接使用,而是應該使用Translate、Scale、Rotate、Shear來代替。

你可以閱讀Applying Transformations in JavaFX文檔或查看API中javafx.scene.transform包來獲取更多信息。

視覺效果

在JavaFX場景中使用視覺效果可以提升JavaFX應用的觀賞度。JavaFX效果主要是基於圖像點的,因此他可以應用於場景中的一組節點,像圖像一樣渲染節點並對其應用指定效果。

在JavaFX中有一些視覺效果,下面是一部分:

◆ 陰影(Drop Shadow):在給定的內容背後渲染陰影。

◆ 反射(Reflection):在內容的下面渲染反射效果

◆ 光照(Lighting):模擬光源照射在給定的內容上,可以將扁平的對象變得更加真實,3D化。

在Creating Visual Effects文檔中有更多的如何使用視覺效果的例子。更多的視覺效果類參見API文檔中的javafx.scene.effect包。

部署

JavaFX應用可以通過三種不同的方式被部署於桌面或在瀏覽器中:

◆ 獨立(Standalone):JavaFX應用被安裝在本地磁盤中,並通過雙擊JAR文件來啓動。當用戶無需進行線上訪問或應用沒有線上功能時,這種模式是最理想的。

◆ 瀏覽器(Browser):在這種模式下,JavaFX應用被嵌入一個Web頁中並隨着Web頁被訪問而自動啓動。它可以跟Web頁中JavaScript進行交互。

◆ 網頁啓動(Web Start):這種模式下,用戶下載應用程序並在本地運行。一旦被下載,用戶在此之後就可以通過雙擊JNLP文件來啓動應用。

你可以閱讀Deploying JavaFX Applications document文檔來查看更多關於三種模式和如何準備JavaFX應用部署的信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章