JavaFX入門(二)之JavaFX體系結構
本章提供了JavaFX體系結構和生態系統的高階描述。
圖2-1說明了JavaFX平臺的架構元件。圖中的部分描述了每個元件以及這些部件如何互連。JavaFX公共API下面是執行JavaFX程式碼的引擎。它由包含JavaFX高效能圖形引擎的子元件組成,稱為Prism; 一個小而有效的視窗系統,稱為玻璃; 媒體引擎和Web引擎。雖然這些元件未公開公開,但它們的描述可以幫助您更好地瞭解執行JavaFX應用程式的內容。
圖2-1 JavaFX架構圖
1、場景圖
JavaFX場景圖(如圖2-1中頂層的一部分所示)是構建JavaFX應用程式的起點。它是一個分層的節點樹,代表應用程式使用者介面的所有可視元素。它可以處理輸入並可以呈現。
場景圖中的單個元素稱為節點。每個節點都有ID,樣式類和邊界卷。除場景圖的根節點外,場景圖中的每個節點都有一個父節點和零個或多個子節點。它還可以具有以下內容:
-
效果,如模糊和陰影
-
不透明度
-
變換
-
事件處理程式(如滑鼠,鍵和輸入法)
-
特定於應用程式的狀態
與Swing和Abstract Window Toolkit(AWT)不同,JavaFX場景圖除了包含控制元件,佈局容器,影象和媒體外,還包括圖形基元,如矩形和文字。
對於大多數用途,場景圖簡化了UI的使用,尤其是在使用豐富的UI時。可以使用javafx.animation API快速完成場景圖中各種圖形的動畫製作,並且宣告性方法(如XML doc)也可以很好地工作。
該javafx.scene
API允許建立和幾種型別的內容,如規範:
-
節點:形狀(2-D和3-D),影象,媒體,嵌入式Web瀏覽器,文字,UI控制元件,圖表,組和容器
-
狀態:變換(節點的定位和方向),視覺效果和內容的其他視覺狀態
-
效果:用於更改場景圖節點外觀的簡單物件,例如模糊,陰影和顏色調整
2、JavaFX功能的Java公共API
圖2-1中所示的JavaFX體系結構的頂層提供了一整套支援富客戶端應用程式開發的Java公共API。這些API為構建富客戶端應用程式提供了無與倫比的自由度和靈活性。JavaFX平臺將Java平臺的最佳功能與全面的沉浸式媒體功能結合到一個直觀,全面的一站式開發環境中。這些Java API for JavaFX功能:
-
允許使用強大的Java功能,例如泛型,註釋,多執行緒和Lamda Expressions(在Java SE 8中引入)。
-
使Web開發人員可以更輕鬆地使用其他基於JVM的動態語言(如Groovy和JavaScript)中的JavaFX。
-
允許Java開發人員使用其他系統語言(如Groovy)來編寫大型或複雜的JavaFX應用程式。
-
允許使用繫結,包括支援高效能延遲繫結,繫結表示式,繫結序列表達式和部分繫結重新評估。替代語言(如Groovy)可以使用此繫結庫來引入類似於JavaFX Script的繫結語法。
-
擴充套件Java集合庫以包括可觀察列表和對映,這允許應用程式將使用者介面連線到資料模型,觀察這些資料模型中的更改,並相應地更新相應的UI控制元件。
JavaFX API和程式設計模型是JavaFX 1.x產品系列的延續。大多數JavaFX API已直接移植到Java。根據從JavaFX 1.x版本的使用者收到的反饋,一些API(例如佈局和媒體)以及許多其他細節已得到改進和簡化。JavaFX更多地依賴於Web標準,例如用於樣式控制元件的CSS和用於可訪問性規範的ARIA。還在審查其他網路標準的使用。
3、圖形系統
JavaFX圖形系統(如圖2-1中的藍色所示)是JavaFX場景圖層下的實現細節。它支援2-D和3-D場景圖。當系統上的圖形硬體不足以支援硬體加速渲染時,它提供軟體渲染。
JavaFX平臺上實現了兩個圖形加速管道:
-
稜鏡過程渲染工作。它可以在硬體和軟體渲染器上執行,包括3-D。它負責JavaFX場景的光柵化和渲染。根據使用的裝置,可能有以下多個渲染路徑:
-
Windows XP和Windows Vista上的DirectX 9
-
Windows 7上的DirectX 11
-
Mac,Linux,Embedded上的OpenGL
-
無法進行硬體加速時的軟體渲染
儘可能使用完全硬體加速路徑,但是當它不可用時,使用軟體渲染路徑,因為軟體渲染路徑已經分佈在所有Java執行時環境(JRE)中。這在處理3-D場景時尤為重要。但是,使用硬體渲染路徑時效能會更好。
-
-
Quantum Toolkit將Prism和Glass Windowing Toolkit結合在一起,並將它們提供給堆疊中位於它們之上的JavaFX層。它還管理與呈現和事件處理相關的執行緒規則。
4、玻璃視窗工具包
Glass Windowing Toolkit,如圖2-1中間部分以米色顯示,是JavaFX圖形堆疊中的最低級別。其主要職責是提供本地操作服務,例如管理視窗,計時器和曲面。它充當依賴於平臺的層,將JavaFX平臺連線到本機作業系統。
Glass工具包還負責管理事件佇列。與管理自己的事件佇列的Abstract Window Toolkit(AWT)不同,Glass工具包使用本機作業系統的事件佇列功能來排程執行緒使用情況。與AWT不同,Glass工具包在與JavaFX應用程式相同的執行緒上執行。在AWT中,AWT的原生一半在一個執行緒上執行,Java級別在另一個執行緒上執行。這引入了許多問題,其中許多問題都是通過使用單一JavaFX應用程式執行緒方法在JavaFX中解決的。
主題
系統在任何給定時間執行以下兩個或多個執行緒。
-
JavaFX應用程式執行緒:這是JavaFX應用程式開發人員使用的主要執行緒。必須從該執行緒訪問任何“實時”場景,該場景是視窗的一部分。可以在後臺執行緒中建立和操作場景圖,但是當其根節點附加到場景中的任何活動物件時,必須從JavaFX應用程式執行緒訪問該場景圖。這使開發人員能夠在後臺執行緒上建立複雜的場景圖,同時保持“實時”場景的動畫流暢,快速。JavaFX應用程式執行緒是與Swing和AWT事件排程執行緒(EDT)不同的執行緒,因此在將JavaFX程式碼嵌入Swing應用程式時必須小心。
-
Prism渲染執行緒:此執行緒與事件排程程式分開處理渲染。它允許在處理幀N + 1時渲染幀N. 這種執行併發處理的能力是一個很大的優勢,特別是在具有多個處理器的現代系統上。Prism渲染執行緒也可能有多個光柵化執行緒,有助於解除安裝需要在渲染中完成的工作。
-
媒體執行緒:此執行緒在後臺執行,並使用JavaFX應用程式執行緒通過場景圖同步最新幀。
脈衝
脈衝是向JavaFX場景圖指示是時候將場景圖上的元素的狀態與Prism同步的事件。脈衝以每秒60幀(fps)的速度進行限制,並在場景圖上執行動畫時觸發。即使動畫未執行,當場景圖中的某些內容發生變化時,也會排程脈衝。例如,如果改變按鈕的位置,則排程脈衝。
觸發脈衝時,場景圖上元素的狀態將向下同步到渲染層。脈衝使應用程式開發人員能夠以非同步方式處理事件。這一重要功能允許系統批量處理脈衝上的事件。
佈局和CSS也與脈衝事件有關。場景圖中的大量更改可能導致多個佈局或CSS更新,這可能會嚴重降低效能。系統每個脈衝自動執行一次CSS和佈局傳遞,以避免效能下降。應用程式開發人員還可以根據需要手動觸發佈局過程,以便在脈衝之前進行測量。
Glass Windowing Toolkit負責執行脈衝事件。它使用高解析度本機定時器來執行。
5、媒體和影象
JavaFX媒體功能可通過javafx.scene.media
API獲得。JavaFX支援視覺和音訊媒體。支援MP3,AIFF和WAV音訊檔案和FLV視訊檔案。JavaFX媒體功能作為三個單獨的元件提供:Media物件表示媒體檔案,MediaPlayer播放媒體檔案,MediaView是顯示媒體的節點。
Media Engine元件(如圖2-1中的綠色所示)在設計時考慮了效能和穩定性,並提供跨平臺的一致行為。有關更多資訊,請閱讀將媒體資產合併到JavaFX應用程式文件中。
6、Web元件
Web元件是基於Webkit的JavaFX UI控制元件,通過其API提供Web檢視器和完整瀏覽功能。此Web Engine元件(如圖2-1中的橙色所示)基於WebKit,WebKit是一個支援HTML5,CSS,JavaScript,DOM和SVG的開源Web瀏覽器引擎。它使開發人員能夠在其Java應用程式中實現以下功能:
-
從本地或遠端URL呈現HTML內容
-
支援歷史記錄並提供後退和前進導航
-
重新載入內容
-
將效果應用於Web元件
-
編輯HTML內容
-
執行JavaScript命令
-
處理事件
此嵌入式瀏覽器元件由以下類組成:
-
WebEngine
提供基本的網頁瀏覽功能。 -
WebView
封裝WebEngine物件,將HTML內容合併到應用程式的場景中,並提供應用效果和轉換的欄位和方法。它是一個Node
類的擴充套件。
此外,可以通過JavaScript控制Java呼叫,反之亦然,以允許開發人員充分利用這兩種環境。有關JavaFX嵌入式瀏覽器的更詳細概述,請參閱向HTMLFX應用程式新增HTML內容文件。
7、CSS
JavaFX級聯樣式表(CSS)提供了將自定義樣式應用於JavaFX應用程式的使用者介面而無需更改任何應用程式原始碼的功能。CSS可以應用於JavaFX場景圖中的任何節點,並以非同步方式應用於節點。JavaFX CSS樣式也可以在執行時輕鬆分配給場景,從而允許應用程式的外觀動態更改。
圖2-2演示了將兩種不同的CSS樣式應用於同一組UI控制元件。
圖2-2 CSS樣式表示例
JavaFX CSS基於W3C CSS 2.1版規範,並在版本3的當前工作中添加了一些內容.JavaFX CSS支援和擴充套件旨在允許任何相容的CSS解析器乾淨地解析JavaFX CSS樣式表,即使是不支援JavaFX擴充套件。這樣就可以將JavaFX的CSS樣式和其他用途(例如HTML頁面)混合到一個樣式表中。所有JavaFX屬性名稱都以供應商副檔名“ -fx-
” 為字首,包括那些似乎與標準HTML CSS相容的屬性,因為某些JavaFX值的語義略有不同。
8、UI控制元件
通過JavaFX API提供的JavaFX UI控制元件是通過使用場景圖中的節點構建的。他們可以充分利用JavaFX平臺的視覺豐富功能,並可跨不同平臺移植。JavaFX CSS允許UI控制元件的主題和外觀。
圖2-3顯示了當前支援的一些UI控制元件。這些控制元件位於javafx.scene.control
包中。
圖2-3 JavaFX UI控制元件示例
有關所有可用JavaFX UI控制元件的更多詳細資訊,請參閱使用JavaFX UI控制元件和該程式包的API文件javafx.scene.control
。
9、佈局
佈局容器或窗格可用於允許JavaFX應用程式的場景圖內的UI控制元件的靈活和動態佈置。JavaFX Layout API包括以下容器類,可自動執行常見的佈局模型:
-
本
BorderPane
類勾畫出其內容節點上,下,左,右,或中心區域。 -
該
HBox
級水平排列其內容節點在單行。 -
所述
VBox
類垂直排列其內容節點在單個列中。 -
該
StackPane
班將它的內容節點在後到前的單堆。 -
本
GridPane
類允許開發人員建立的行和列的靈活的網格中,奠定了內容節點。 -
所述
FlowPane
類安排其內容節點在水平或垂直的“流”,纏繞在指定的寬度(對於水平)或高度(對於垂直)的邊界。 -
該
TilePane
班將它的內容節點,大小均勻的佈局單元格或瓷磚 -
在
AnchorPane
類允許開發人員建立錨節點的頂部,底部,左側,或中心的佈局。
為了實現所需的佈局結構,可以將不同的容器巢狀在JavaFX應用程式中。
要了解有關如何使用佈局的更多資訊,請參閱JavaFX中的使用佈局文章。有關JavaFX佈局API的更多資訊,請參閱該javafx.scene.layout
軟體包的API文件。
10、二維和三維轉換
可以使用以下javafx.scene.tranform
類在xy座標中轉換JavaFX場景圖中的每個節點:
-
translate
- 沿x,y,z平面相對於其初始位置將節點從一個位置移動到另一個位置。 -
scale
- 根據縮放因子,調整節點的大小,使其在x,y,z平面中顯得更大或更小。 -
shear
- 旋轉一個軸,使x軸和y軸不再垂直。節點的座標移動指定的乘數。 -
rotate
- 圍繞場景的指定軸點旋轉節點。 -
affine
- 執行從2-D / 3-D座標到其他2-D / 3-D座標的線性對映,同時保留線的“直線”和“平行”屬性。此類應用使用Translate
,Scale
,Rotate
,或Shear
變換,而不是直接使用的類。
要了解有關使用轉換的更多資訊,請參閱JavaFX文件中的應用轉換。有關javafx.scene.transform
API類的更多資訊,請參閱API文件。
11、視覺效果
JavaFX場景圖中富客戶端介面的開發涉及使用Visual Effects或Effects來實時增強JavaFX應用程式的外觀。JavaFX效果主要是基於影象畫素的,因此,它們採用場景圖中的節點集,將其渲染為影象,並將指定的效果應用於它。
JavaFX中可用的一些視覺效果包括使用以下類:
-
Drop Shadow
- 在應用效果的內容後面呈現給定內容的陰影。 -
Reflection
- 在實際內容下方呈現內容的反映版本。 -
Lighting
- 模擬照射在給定內容上的光源,並使平面物體具有更逼真的三維外觀。
有關如何使用某些可用視覺效果的示例,請參閱“ 建立視覺效果”文件。有關所有可用視覺效果類的更多資訊,請參閱該包的API文件javafx.scene.effect
。