JavaFX官方教程(二)之JavaFX体系结构
翻譯自? ?JavaFX體系結(jié)構(gòu)
本章提供了JavaFX體系結(jié)構(gòu)和生態(tài)系統(tǒng)的高級描述。
圖2-1說明了JavaFX平臺的架構(gòu)組件。圖中的部分描述了每個組件以及這些部件如何互連。JavaFX公共API下面是運行JavaFX代碼的引擎。它由包含JavaFX高性能圖形引擎的子組件組成,稱為Prism;?一個小而有效的窗口系統(tǒng),稱為玻璃;?媒體引擎和Web引擎。雖然這些組件未公開公開,但它們的描述可以幫助您更好地了解運行JavaFX應(yīng)用程序的內(nèi)容。
-
場景圖
-
JavaFX功能的Java公共API
-
圖形系統(tǒng)
-
玻璃窗口工具包
-
媒體和圖像
-
Web組件
-
CSS
-
UI控件
-
布局
-
二維和三維轉(zhuǎn)換
-
視覺效果
圖2-1 JavaFX架構(gòu)圖
?
1、場景圖
JavaFX場景圖(如圖2-1中頂層的一部分所示)是構(gòu)建JavaFX應(yīng)用程序的起點。它是一個分層的節(jié)點樹,代表應(yīng)用程序用戶界面的所有可視元素。它可以處理輸入并可以呈現(xiàn)。
場景圖中的單個元素稱為節(jié)點。每個節(jié)點都有ID,樣式類和邊界卷。除場景圖的根節(jié)點外,場景圖中的每個節(jié)點都有一個父節(jié)點和零個或多個子節(jié)點。它還可以具有以下內(nèi)容:
-
效果,如模糊和陰影
-
不透明度
-
變換
-
事件處理程序(如鼠標(biāo),鍵和輸入法)
-
特定于應(yīng)用程序的狀態(tài)
與Swing和Abstract Window Toolkit(AWT)不同,JavaFX場景圖除了包含控件,布局容器,圖像和媒體外,還包括圖形基元,如矩形和文本。
對于大多數(shù)用途,場景圖簡化了UI的使用,尤其是在使用豐富的UI時。可以使用javafx.animation API快速完成場景圖中各種圖形的動畫制作,并且聲明性方法(如XML doc)也可以很好地工作。
該javafx.sceneAPI允許創(chuàng)建和幾種類型的內(nèi)容,如規(guī)范:
-
節(jié)點:形狀(2-D和3-D),圖像,媒體,嵌入式Web瀏覽器,文本,UI控件,圖表,組和容器
-
狀態(tài):變換(節(jié)點的定位和方向),視覺效果和內(nèi)容的其他視覺狀態(tài)
-
效果:用于更改場景圖節(jié)點外觀的簡單對象,例如模糊,陰影和顏色調(diào)整
有關(guān)更多信息,請參閱使用JavaFX場景圖文檔。
?
2、JavaFX功能的Java公共API
圖2-1中所示的JavaFX體系結(jié)構(gòu)的頂層提供了一整套支持富客戶端應(yīng)用程序開發(fā)的Java公共API。這些API為構(gòu)建富客戶端應(yīng)用程序提供了無與倫比的自由度和靈活性。JavaFX平臺將Java平臺的最佳功能與全面的沉浸式媒體功能結(jié)合到一個直觀,全面的一站式開發(fā)環(huán)境中。這些Java API for JavaFX功能:
-
允許使用強大的Java功能,例如泛型,注釋,多線程和Lamda Expressions(在Java SE 8中引入)。
-
使Web開發(fā)人員可以更輕松地使用其他基于JVM的動態(tài)語言(如Groovy和JavaScript)中的JavaFX。
-
允許Java開發(fā)人員使用其他系統(tǒng)語言(如Groovy)來編寫大型或復(fù)雜的JavaFX應(yīng)用程序。
-
允許使用綁定,包括支持高性能延遲綁定,綁定表達式,綁定序列表達式和部分綁定重新評估。替代語言(如Groovy)可以使用此綁定庫來引入類似于JavaFX Script的綁定語法。
-
擴展Java集合庫以包括可觀察列表和映射,這允許應(yīng)用程序?qū)⒂脩艚缑孢B接到數(shù)據(jù)模型,觀察這些數(shù)據(jù)模型中的更改,并相應(yīng)地更新相應(yīng)的UI控件。
JavaFX API和編程模型是JavaFX 1.x產(chǎn)品系列的延續(xù)。大多數(shù)JavaFX API已直接移植到Java。根據(jù)從JavaFX 1.x版本的用戶收到的反饋,一些API(例如布局和媒體)以及許多其他細節(jié)已得到改進和簡化。JavaFX更多地依賴于Web標(biāo)準(zhǔn),例如用于樣式控件的CSS和用于可訪問性規(guī)范的ARIA。還在審查其他網(wǎng)絡(luò)標(biāo)準(zhǔn)的使用。
?
3、圖形系統(tǒng)
JavaFX圖形系統(tǒng)(如圖2-1中的藍色所示)是JavaFX場景圖層下的實現(xiàn)細節(jié)。它支持2-D和3-D場景圖。當(dāng)系統(tǒng)上的圖形硬件不足以支持硬件加速渲染時,它提供軟件渲染。
JavaFX平臺上實現(xiàn)了兩個圖形加速管道:
-
棱鏡過程渲染工作。它可以在硬件和軟件渲染器上運行,包括3-D。它負責(zé)JavaFX場景的光柵化和渲染。根據(jù)使用的設(shè)備,可能有以下多個渲染路徑:
-
Windows XP和Windows Vista上的DirectX 9
-
Windows 7上的DirectX 11
-
Mac,Linux,Embedded上的OpenGL
-
無法進行硬件加速時的軟件渲染
盡可能使用完全硬件加速路徑,但是當(dāng)它不可用時,使用軟件渲染路徑,因為軟件渲染路徑已經(jīng)分布在所有Java運行時環(huán)境(JRE)中。這在處理3-D場景時尤為重要。但是,使用硬件渲染路徑時性能會更好。
-
-
Quantum Toolkit將Prism和Glass Windowing Toolkit結(jié)合在一起,并將它們提供給堆棧中位于它們之上的JavaFX層。它還管理與呈現(xiàn)和事件處理相關(guān)的線程規(guī)則。
?
4、玻璃窗口工具包
Glass Windowing Toolkit,如圖2-1中間部分以米色顯示,是JavaFX圖形堆棧中的最低級別。其主要職責(zé)是提供本地操作服務(wù),例如管理窗口,計時器和曲面。它充當(dāng)依賴于平臺的層,將JavaFX平臺連接到本機操作系統(tǒng)。
Glass工具包還負責(zé)管理事件隊列。與管理自己的事件隊列的Abstract Window Toolkit(AWT)不同,Glass工具包使用本機操作系統(tǒng)的事件隊列功能來調(diào)度線程使用情況。與AWT不同,Glass工具包在與JavaFX應(yīng)用程序相同的線程上運行。在AWT中,AWT的原生一半在一個線程上運行,Java級別在另一個線程上運行。這引入了許多問題,其中許多問題都是通過使用單一JavaFX應(yīng)用程序線程方法在JavaFX中解決的。
主題
系統(tǒng)在任何給定時間運行以下兩個或多個線程。
-
JavaFX應(yīng)用程序線程:這是JavaFX應(yīng)用程序開發(fā)人員使用的主要線程。必須從該線程訪問任何“實時”場景,該場景是窗口的一部分。可以在后臺線程中創(chuàng)建和操作場景圖,但是當(dāng)其根節(jié)點附加到場景中的任何活動對象時,必須從JavaFX應(yīng)用程序線程訪問該場景圖。這使開發(fā)人員能夠在后臺線程上創(chuàng)建復(fù)雜的場景圖,同時保持“實時”場景的動畫流暢,快速。JavaFX應(yīng)用程序線程是與Swing和AWT事件調(diào)度線程(EDT)不同的線程,因此在將JavaFX代碼嵌入Swing應(yīng)用程序時必須小心。
-
Prism渲染線程:此線程與事件調(diào)度程序分開處理渲染。它允許在處理幀N + 1時渲染幀N.?這種執(zhí)行并發(fā)處理的能力是一個很大的優(yōu)勢,特別是在具有多個處理器的現(xiàn)代系統(tǒng)上。Prism渲染線程也可能有多個光柵化線程,有助于卸載需要在渲染中完成的工作。
-
媒體線程:此線程在后臺運行,并使用JavaFX應(yīng)用程序線程通過場景圖同步最新幀。
脈沖
脈沖是向JavaFX場景圖指示是時候?qū)鼍皥D上的元素的狀態(tài)與Prism同步的事件。脈沖以每秒60幀(fps)的速度進行限制,并在場景圖上運行動畫時觸發(fā)。即使動畫未運行,當(dāng)場景圖中的某些內(nèi)容發(fā)生變化時,也會調(diào)度脈沖。例如,如果改變按鈕的位置,則調(diào)度脈沖。
觸發(fā)脈沖時,場景圖上元素的狀態(tài)將向下同步到渲染層。脈沖使應(yīng)用程序開發(fā)人員能夠以異步方式處理事件。這一重要功能允許系統(tǒng)批量處理脈沖上的事件。
布局和CSS也與脈沖事件有關(guān)。場景圖中的大量更改可能導(dǎo)致多個布局或CSS更新,這可能會嚴重降低性能。系統(tǒng)每個脈沖自動執(zhí)行一次CSS和布局傳遞,以避免性能下降。應(yīng)用程序開發(fā)人員還可以根據(jù)需要手動觸發(fā)布局過程,以便在脈沖之前進行測量。
Glass Windowing Toolkit負責(zé)執(zhí)行脈沖事件。它使用高分辨率本機定時器來執(zhí)行。
?
5、媒體和圖像
JavaFX媒體功能可通過javafx.scene.mediaAPI獲得。JavaFX支持視覺和音頻媒體。支持MP3,AIFF和WAV音頻文件和FLV視頻文件。JavaFX媒體功能作為三個單獨的組件提供:Media對象表示媒體文件,MediaPlayer播放媒體文件,MediaView是顯示媒體的節(jié)點。
Media Engine組件(如圖2-1中的綠色所示)在設(shè)計時考慮了性能和穩(wěn)定性,并提供跨平臺的一致行為。有關(guān)更多信息,請閱讀將媒體資產(chǎn)合并到JavaFX應(yīng)用程序文檔中。
?
6、Web組件
Web組件是基于Webkit的JavaFX UI控件,通過其API提供Web查看器和完整瀏覽功能。此Web Engine組件(如圖2-1中的橙色所示)基于WebKit,WebKit是一個支持HTML5,CSS,JavaScript,DOM和SVG的開源Web瀏覽器引擎。它使開發(fā)人員能夠在其Java應(yīng)用程序中實現(xiàn)以下功能:
-
從本地或遠程URL呈現(xiàn)HTML內(nèi)容
-
支持歷史記錄并提供后退和前進導(dǎo)航
-
重新加載內(nèi)容
-
將效果應(yīng)用于Web組件
-
編輯HTML內(nèi)容
-
執(zhí)行JavaScript命令
-
處理事件
此嵌入式瀏覽器組件由以下類組成:
-
WebEngine?提供基本的網(wǎng)頁瀏覽功能。
-
WebView封裝WebEngine對象,將HTML內(nèi)容合并到應(yīng)用程序的場景中,并提供應(yīng)用效果和轉(zhuǎn)換的字段和方法。它是一個Node類的擴展。
此外,可以通過JavaScript控制Java調(diào)用,反之亦然,以允許開發(fā)人員充分利用這兩種環(huán)境。有關(guān)JavaFX嵌入式瀏覽器的更詳細概述,請參閱向HTMLFX應(yīng)用程序添加HTML內(nèi)容文檔。
?
7、CSS
JavaFX級聯(lián)樣式表(CSS)提供了將自定義樣式應(yīng)用于JavaFX應(yīng)用程序的用戶界面而無需更改任何應(yīng)用程序源代碼的功能。CSS可以應(yīng)用于JavaFX場景圖中的任何節(jié)點,并以異步方式應(yīng)用于節(jié)點。JavaFX CSS樣式也可以在運行時輕松分配給場景,從而允許應(yīng)用程序的外觀動態(tài)更改。
圖2-2演示了將兩種不同的CSS樣式應(yīng)用于同一組UI控件。
圖2-2 CSS樣式表示例
JavaFX CSS基于W3C CSS 2.1版規(guī)范,并在版本3的當(dāng)前工作中添加了一些內(nèi)容.JavaFX CSS支持和擴展旨在允許任何兼容的CSS解析器干凈地解析JavaFX CSS樣式表,即使是不支持JavaFX擴展。這樣就可以將JavaFX的CSS樣式和其他用途(例如HTML頁面)混合到一個樣式表中。所有JavaFX屬性名稱都以供應(yīng)商擴展名“?-fx-”?為前綴,包括那些似乎與標(biāo)準(zhǔn)HTML CSS兼容的屬性,因為某些JavaFX值的語義略有不同。
有關(guān)JavaFX CSS的更多詳細信息,請參閱使用CSS獲取JavaFX應(yīng)用程序文檔。
?
8、UI控件
通過JavaFX API提供的JavaFX UI控件是通過使用場景圖中的節(jié)點構(gòu)建的。他們可以充分利用JavaFX平臺的視覺豐富功能,并可跨不同平臺移植。JavaFX CSS允許UI控件的主題和外觀。
圖2-3顯示了當(dāng)前支持的一些UI控件。這些控件位于javafx.scene.control包中。
圖2-3 JavaFX UI控件示例
有關(guān)所有可用JavaFX UI控件的更多詳細信息,請參閱使用JavaFX UI控件和該程序包的API文檔javafx.scene.control。
?
9、布局
布局容器或窗格可用于允許JavaFX應(yīng)用程序的場景圖內(nèi)的UI控件的靈活和動態(tài)布置。JavaFX Layout API包括以下容器類,可自動執(zhí)行常見的布局模型:
-
本BorderPane類勾畫出其內(nèi)容節(jié)點上,下,左,右,或中心區(qū)域。
-
該HBox級水平排列其內(nèi)容節(jié)點在單行。
-
所述VBox類垂直排列其內(nèi)容節(jié)點在單個列中。
-
該StackPane班將它的內(nèi)容節(jié)點在后到前的單堆。
-
本GridPane類允許開發(fā)人員創(chuàng)建的行和列的靈活的網(wǎng)格中,奠定了內(nèi)容節(jié)點。
-
所述FlowPane類安排其內(nèi)容節(jié)點在水平或垂直的“流”,纏繞在指定的寬度(對于水平)或高度(對于垂直)的邊界。
-
該TilePane班將它的內(nèi)容節(jié)點,大小均勻的布局單元格或瓷磚
-
在AnchorPane類允許開發(fā)人員創(chuàng)建錨節(jié)點的頂部,底部,左側(cè),或中心的布局。
為了實現(xiàn)所需的布局結(jié)構(gòu),可以將不同的容器嵌套在JavaFX應(yīng)用程序中。
要了解有關(guān)如何使用布局的更多信息,請參閱JavaFX中的使用布局文章。有關(guān)JavaFX布局API的更多信息,請參閱該javafx.scene.layout軟件包的API文檔。
?
10、二維和三維轉(zhuǎn)換
可以使用以下javafx.scene.tranform類在xy坐標(biāo)中轉(zhuǎn)換JavaFX場景圖中的每個節(jié)點:
-
translate?- 沿x,y,z平面相對于其初始位置將節(jié)點從一個位置移動到另一個位置。
-
scale?- 根據(jù)縮放因子,調(diào)整節(jié)點的大小,使其在x,y,z平面中顯得更大或更小。
-
shear?- 旋轉(zhuǎn)一個軸,使x軸和y軸不再垂直。節(jié)點的坐標(biāo)移動指定的乘數(shù)。
-
rotate?- 圍繞場景的指定軸點旋轉(zhuǎn)節(jié)點。
-
affine?- 執(zhí)行從2-D / 3-D坐標(biāo)到其他2-D / 3-D坐標(biāo)的線性映射,同時保留線的“直線”和“平行”屬性。此類應(yīng)用使用Translate,Scale,Rotate,或Shear變換,而不是直接使用的類。
要了解有關(guān)使用轉(zhuǎn)換的更多信息,請參閱JavaFX文檔中的應(yīng)用轉(zhuǎn)換。有關(guān)javafx.scene.transformAPI類的更多信息,請參閱API文檔。
?
11、視覺效果
JavaFX場景圖中富客戶端接口的開發(fā)涉及使用Visual Effects或Effects來實時增強JavaFX應(yīng)用程序的外觀。JavaFX效果主要是基于圖像像素的,因此,它們采用場景圖中的節(jié)點集,將其渲染為圖像,并將指定的效果應(yīng)用于它。
JavaFX中可用的一些視覺效果包括使用以下類:
-
Drop Shadow?- 在應(yīng)用效果的內(nèi)容后面呈現(xiàn)給定內(nèi)容的陰影。
-
Reflection?- 在實際內(nèi)容下方呈現(xiàn)內(nèi)容的反映版本。
-
Lighting?- 模擬照射在給定內(nèi)容上的光源,并使平面物體具有更逼真的三維外觀。
有關(guān)如何使用某些可用視覺效果的示例,請參閱“?創(chuàng)建視覺效果”文檔。有關(guān)所有可用視覺效果類的更多信息,請參閱該包的API文檔javafx.scene.effect。
總結(jié)
以上是生活随笔為你收集整理的JavaFX官方教程(二)之JavaFX体系结构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《巫师之昆特牌》获 11.10 更新:由
- 下一篇: JavaFX官方教程(三)之JavaFX