1. 程式人生 > >JavaFX入門(二)之JavaFX體系結構

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.sceneAPI允許建立和幾種型別的內容,如規範:

  • 節點:形狀(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.mediaAPI獲得。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座標的線性對映,同時保留線的“直線”和“平行”屬性。此類應用使用TranslateScaleRotate,或Shear變換,而不是直接使用的類。

要了解有關使用轉換的更多資訊,請參閱JavaFX文件中的應用轉換。有關javafx.scene.transformAPI類的更多資訊,請參閱API文件

11、視覺效果

JavaFX場景圖中富客戶端介面的開發涉及使用Visual Effects或Effects來實時增強JavaFX應用程式的外觀。JavaFX效果主要是基於影象畫素的,因此,它們採用場景圖中的節點集,將其渲染為影象,並將指定的效果應用於它。

JavaFX中可用的一些視覺效果包括使用以下類:

  • Drop Shadow - 在應用效果的內容後面呈現給定內容的陰影。

  • Reflection - 在實際內容下方呈現內容的反映版本。

  • Lighting - 模擬照射在給定內容上的光源,並使平面物體具有更逼真的三維外觀。

有關如何使用某些可用視覺效果的示例,請參閱“ 建立視覺效果”文件。有關所有可用視覺效果類的更多資訊,請參閱該包的API文件javafx.scene.effect