圖1 JavaFX 2.0 架構圖
場景(Scene Graph)
JavaFX的場景(Scene Graph)是JavaFX應用程序創(chuàng)建的開始點。它是一棵層次樹,其每個節(jié)點都代表了一個應用程序UI的視覺元素。它可以處理輸入并被渲染。
在場景中的一個元素叫做節(jié)點(node)。每個節(jié)點都有其ID,樣式類別和包圍盒(不熟悉計算機圖形學…..原文為bounding volume,我挺想翻譯為基準線或者輪廓線的)。在場景中的每個節(jié)點都有一個唯一的雙親節(jié)點和零到多個孩子結點。一個節(jié)點還可以包含:
◆ 效果(Effect),比如模糊或陰影效果
◆ 透明
◆ 變換
◆ 事件處理(比如鼠標、鍵盤或其他輸入方式)
◆ 應用程序定義的狀態(tài)
不同于Swing或者AWT,JavaFX的場景除了包含控制、布局管理器、圖像和媒體外,也有基本圖元,如矩形或者文字。
對于大多數(shù)用戶來說,場景簡化了用戶實現(xiàn)UI的工作,特別是用戶實現(xiàn)富UI的時候。在場景中繪制各種圖形可以被快捷地完成,而且可以使用如XML文檔一樣的聲明式方法。
javafx.scene API允許創(chuàng)建和定義許多種內容,如:
◆ 節(jié)點(Nodes):2D或者3D的圖形、圖像、媒體、嵌入式web瀏覽器、文字、UI控件、圖標、組和容器。
◆ 狀態(tài)(State):變換(節(jié)點的位置和方向),視覺效果和其他內容的視覺狀態(tài)。
◆ 動畫(Animation):場景對象在一段時間中的屬性變化
◆ 效果(Effects):可以修改場景節(jié)點的外觀,如模糊、陰影和顏色調整。
你可以從Working with the JavaFX Scene Graph文檔獲取更多的信息。
為實現(xiàn)JavaFX特征提供的Java API
如圖1中的最頂層顯示的那樣,JavaFX 2.0平臺包括一組完整的公共API。這些API為創(chuàng)建富客戶端應用提供無可比擬的自由度和靈活性。JavaFX平臺將Java平臺的如身臨其境般的媒體功能融入直觀的一站式綜合開發(fā)環(huán)境之中。這些新的Java API實現(xiàn)了JavaFX的以下特點:
◆ 允許使用強大的Java語言特征,如泛型、注解和多線程技術
◆ 對于Web開發(fā)人員,JavaFX提供使用動態(tài)語言編寫方式,如使用JRuby、Groovy和JavaScript
◆ 允許Java開發(fā)人員使用其他的系統(tǒng)語言去編寫龐大復雜的JavaFX應用,如Groovy
◆ 允許使用與JavaFX腳本語言類似的綁定機制(binding)。這包括提供高性能的延遲綁定機制,綁定表達式和序列表達式,部分綁定重求值(不理解….)。其他語言(如Groovy)可以使用如JavaFX腳本語言一樣的綁定庫來實現(xiàn)語法級別的綁定。
◆ JavaFX擴展了Java集合庫,加入了observable lists和maps。這允許應用程序將UI和數(shù)據(jù)模型進行連接,UI可以觀測數(shù)據(jù)模型的改變并進行直接更新。
JavaFX 2.0 API和編程模型是JavaFX 1.x的延續(xù)。大部分JavaFX API都與Java直接相連。一些API已經根據(jù)JavaFX 1.x使用者的反饋進行了更新(包括性能和易用性的提升),如布局管理(Layout)和媒體(Media)。而且JavaFX 2.0更加支持Web標準,如可以使用CSSS作為樣式控制和使用無障礙規(guī)范建立ARIA。更多的Web標準也正在審核之中。
圖形系統(tǒng)
在圖1中用藍色的部分是JavaFX圖形系統(tǒng)。它是JavaFX場景層的下層細節(jié)實現(xiàn)。它為2D和3D的場景提供支持。當系統(tǒng)的圖形硬件設備無法支持硬件渲染的時候,它提供軟件渲染支持。
在JavaFX平臺上實現(xiàn)了兩個圖形加速管道:
Prism:Prism處理渲染工作。他的渲染工作,包括3D渲染,都可以運行在硬件和軟件渲染單元之上。它負責處理光柵和渲染JavaFX場景?;谒褂玫脑O備的不同,可能有以下的渲染途徑:
◆ 在Windows XP和Vista下使用DirectX 9
◆ 在Windows 7下使用DirectX 11
◆ 在Mac,Linux,嵌入式系統(tǒng)上使用OpenGL
◆ 如果硬件加速不可用,使用Java2D
如果可用時,所有的硬件加速途徑都將被使用。但如果不可用,Java2D渲染途徑將被使用。這是由于該渲染技術已經包含在JRE中。這可能在進行3D場景處理時很重要,但是一旦硬件渲染途徑可用,性能就會比較好。
l Quantum Toolkit:Quantum Toolkit將Prism和Glass窗口工具結合在一起并使在整個JavaFX層次結構中上層組件可用。它也同時管理著與事件處理相對的渲染線程規(guī)則。
Glass窗口工具
在圖1中間所示的Glass窗口工具是JavaFX 2.0圖形棧中最底層的框架。他的主要責任是提供本地系統(tǒng)服務,比如說控制窗口,計時器或外觀。它作為平臺依賴層銜接著JavaFX平臺和操作系統(tǒng)。
Glass工具包也為事件隊列提供管理功能。不同于AWT管理其自身所具有的事件隊列,Glass工具包使用操作系統(tǒng)事件隊列去管理線程。同樣不同于AWT的是,Glass工具包與JavaFX應用運行于同一線程。而在AWT中,原生AWT運行于一個線程而Java層次運行于另一個線程。這樣會帶來許多問題,而JavaFX使用單一JavaFX線程來解決這類問題。
線程
任何時候,整個JavaFX系統(tǒng)都運行于兩個以上的線程:
◆ JavaFX應用程序線程(JavaFX Application Thread):這是JavaFX應用開發(fā)人員所要使用的主要線程。任何“活著的”場景(指場景是窗口的一部分)都只能從這個線程訪問。然而,場景也可以從后臺線程創(chuàng)建,這使得開發(fā)人員可以從后臺線程創(chuàng)建復雜的場景而同時保證“活著的”場景中的動畫平滑而快速地播放。JavaFX應用程序線程與Swing 或AWT得事件派發(fā)線程(EDT)不同,所以當把JavaFX代碼嵌入Swing應用中時,必須格外當心。
◆ Prism渲染線程(Prism Render Thread):這個線程只處理渲染工作,而不干預事件派發(fā)線程。它允許第N幀播放時的同時,N+1幀正在被處理。這種能力對于提高并發(fā)處理能力有著極大地好處,尤其是在現(xiàn)代的多處理器系統(tǒng)中尤為出色。Prism渲染線程也可以開啟多個光柵線程去幫助分擔渲染工作。
◆ 媒體線程(Media Thread):這個線程運行于后臺并通過JavaFX應用程序線程所使用的場景來同步最新的幀。
脈搏(Pulse)
脈搏(Pulse,先這么翻譯吧,等官方翻譯出來再修改,其本質就是Repaint信號)是JavaFX應使用Prism去同步場景和場景中的元素狀態(tài)的標志。脈搏的最大速度為60幀/秒(FPS),而且無論何時只要場景中的動畫進行,那么就會發(fā)送脈搏通知。即使動畫沒有進行,當場景發(fā)生改變,也會發(fā)送脈搏通知。例如,當一個按鈕的位置發(fā)生了變化,那么就會安排一個脈搏通知。
當發(fā)送脈搏信號后,場景中的元素的狀態(tài)就會根據(jù)渲染層進行同步。脈搏可以使應用程序開發(fā)者對于事件進行異步處理。這個重要的特點使得系統(tǒng)可以在一個脈搏來臨前將事件進行批量處理。
布局管理和CSS也關聯(lián)于脈搏信號。場景的眾多變化可能導致多次布局或CSS的更新,這種更新會導致性能的降低。JavaFX系統(tǒng)會自動地在每次脈搏信號來臨時將CSS或布局進行發(fā)送,從而避免系統(tǒng)性能下降。應用程序開發(fā)人員也可以手動觸發(fā)布局或CSS變更通知的發(fā)送。
Glass窗口工具負責使用高性能的系統(tǒng)原生計時器來發(fā)送脈搏信號。
媒體與圖像
JavaFX媒體功能是通過javafx.scene.media API實現(xiàn)的。JavaFX提供顯示和音頻媒體功能。支持MP3,AIFF,WAV音頻文件和FLV視頻文件。JavaFX媒體功能由三個組件提供:媒體對象代表著媒體文件,媒體播放器用來播放媒體文件,媒體視圖是代表著媒體的節(jié)點。
在圖1中綠色的部分是媒體引擎組件,這部分已經在JavaFX 2.0中被完全重新設計了,增加了性能和穩(wěn)定性,并提供了跨平臺一致性。你可以閱讀Incorporating Media Assets into JavaFX Applications文檔來獲取更多的信息。
嵌入式瀏覽器
JavaFX嵌入式瀏覽器是JavaFX新的UI組件,它通過API提供了Web顯示和訪問的全部功能。圖1中橙色的部分是基于WebKit的 Web引擎組件(WebKit是一款支持HTML5、CSS、Javascript、Dom和SVG的開源Web瀏覽器引擎)。它使開發(fā)人員可以在他們的 Java應用中實現(xiàn)以下功能:
◆ 渲染本地或遠程的HTML內容
◆ 支持歷史功能,并提供前進和后退導航
◆ 重新載入內容
◆ 向Web組件增加效果
◆ 編輯HTML內容
◆ 執(zhí)行JavaScript命令
◆ 處理事件
這個嵌入式瀏覽器組件包括一下的類:
◆ WebEngine 提供基本的Web頁訪問功能
◆ WebView 封裝了一個WebEngine對象,可將HTML內容放入應用程序場景中,并提供域和方法來應用效果和變換。它是Node類的子類。
你可以閱讀Adding HTML Content to JavaFX Applications文檔來獲取更多的關于JavaFX嵌入式瀏覽器的細節(jié)。
CSS
在JavaFX中CSS提供了對于JavaFX中UI應用定制樣式而無需改變代碼的能力。CSS可以被異步地應用于任何JavaFX場景中的節(jié)點。JavaFX CSS樣式也可以在運行期間被簡單地賦予場景,并允許動態(tài)修改應用程序外觀。
圖2顯示了同一應用程序在兩個不同CSS樣式下的效果:
圖2 CSS樣式范例
JavaFX CSS基于W3C CSS ver2.1版本規(guī)范與現(xiàn)在正在使用的ver3版本的一部分。JavaFX CSS可以使用任何CSS解析器,甚至那些不支持JavaFX擴展的部分的。這樣可以將為JavaFX和為其他目的(如HTML頁)所寫的CSS混合為一個文件。由于JavaFX具有輕微不同的詞法,所有的JavaFX屬性名都以“-fx-”開頭,包括那些可兼容于標準HTML的CSS。
你可以閱讀 Skinning JavaFX Applications with CSS文章來獲取更多的信息。
UI控件
JavaFX中UI控件可以通過使用場景中的節(jié)點的API來實現(xiàn)。它們從JavaFX平臺的豐富的可視化特點中獲得優(yōu)勢并在跨平臺時有著輕微的不同。JavaFX CSS允許為UI控件定制主題和皮膚。
圖3顯示了一些現(xiàn)在支持的控件。新的控件,如TitlePane或Accordion,都將在JavaFX 2.0 SDK中被引入。這些控件位于javafx.scene.control包中。
圖3 JavaFX UI控件范例
你可以閱讀Using JavaFX UI Controls文檔和API文檔中的javafx.scene.control 包來獲取更多的細節(jié)信息。
布局
布局容器或窗格可被用于在JavaFX應用程序場景中動態(tài)、靈活地管理UI控件。JavaFX布局API包括以下容器類,這些類可以自動進行布局:
◆ BorderPane將其內容節(jié)點分布于上、下、左、右、中間位置。
◆ HBox將其內容節(jié)點水平布局于一行中
◆ VBox將其內容節(jié)點垂直布局于一列中
◆ StackPane將其內容節(jié)點以從后到前的順序布局于一個棧中
◆ GridPane允許開發(fā)人員創(chuàng)建靈活行列數(shù)目的格子,并在格子中存放內容節(jié)點
◆ FlowPane將其內容節(jié)點在水平方向或垂直方向上按順序布局,并以特定寬度和高度的邊界進行包裹。
◆ TilePane將其內容節(jié)點布局于一致大小的單元中。
◆ AnchorPane允許開發(fā)人員在上下左右或者中間創(chuàng)建錨節(jié)點。
在JavaFX應用中,想要實現(xiàn)希望的布局效果,可以綜合使用不同的容器。
你可以閱讀Working with Layouts in JavaFX文獻或查看API中的javafx.scene.layout包來獲取更多信息。
2D和3D變換
在JavaFX場景中的每個節(jié)點都可以使用javafx.scene.transform(原文這里應該是打錯了)進行二維坐標變換:
◆ 平移變換(translate):將一個節(jié)點從一個地方根據(jù)初始位置移動到另一個地方
◆ 拉伸變換(scale):將一個節(jié)點根據(jù)縮放因子進行縮放
◆ 扭曲變換(shear):將一個節(jié)點根據(jù)不垂直的x、y軸進行旋轉。
◆ 旋轉變換(rotate):將一個節(jié)點根據(jù)場景中的某個點進行旋轉
◆ 仿射變換(affine):(若干balabala…看計算機圖形學教材吧…)該變換不應被直接使用,而是應該使用Translate、Scale、Rotate、Shear來代替。
你可以閱讀Applying Transformations in JavaFX文檔或查看API中javafx.scene.transform包來獲取更多信息。
視覺效果
在JavaFX場景中使用視覺效果可以提升JavaFX應用的觀賞度。JavaFX效果主要是基于圖像點的,因此他可以應用于場景中的一組節(jié)點,像圖像一樣渲染節(jié)點并對其應用指定效果。
在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應用部署的信息。