JavaFX架構(gòu)與框架

2011-10-11 09:19:42來源:作者:

JavaFX 2.0平臺是基于Java技術(shù)的富客戶端平臺。它使應(yīng)用程序開發(fā)者更加容易的開發(fā)和部署跨平臺的富互聯(lián)網(wǎng)應(yīng)用(RIA)。JavaFX 2.0文檔包含了JavaFX 2.0所提供的功能的概述。

JavaFX 2.0平臺是基于Java技術(shù)的富客戶端平臺。它使應(yīng)用程序開發(fā)者更加容易的開發(fā)和部署跨平臺的富互聯(lián)網(wǎng)應(yīng)用(RIA)。JavaFX 2.0文檔包含了JavaFX 2.0所提供的功能的概述。

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

JavaFX 2.0 架構(gòu)圖
 

圖1 JavaFX 2.0 架構(gòu)圖

場景(Scene Graph)

JavaFX的場景(Scene Graph)是JavaFX應(yīng)用程序創(chuàng)建的開始點(diǎn)。它是一棵層次樹,其每個(gè)節(jié)點(diǎn)都代表了一個(gè)應(yīng)用程序UI的視覺元素。它可以處理輸入并被渲染。

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

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

l  透明

l  變換

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

l  應(yīng)用程序定義的狀態(tài)

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

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

javafx.scene API允許創(chuàng)建和定義許多種內(nèi)容,如:

l  節(jié)點(diǎn)(Nodes):2D或者3D的圖形、圖像、媒體、嵌入式web瀏覽器、文字、UI控件、圖標(biāo)、組和容器。

l  狀態(tài)(State):變換(節(jié)點(diǎn)的位置和方向),視覺效果和其他內(nèi)容的視覺狀態(tài)。

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

l  效果(Effects):可以修改場景節(jié)點(diǎn)的外觀,如模糊、陰影和顏色調(diào)整。

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

為實(shí)現(xiàn)JavaFX特征提供的Java API

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

l  允許使用強(qiáng)大的Java語言特征,如泛型、注解和多線程技術(shù)

l  對于Web開發(fā)人員,JavaFX提供使用動態(tài)語言編寫方式,如使用JRuby、Groovy和JavaScript

l  允許Java開發(fā)人員使用其他的系統(tǒng)語言去編寫龐大復(fù)雜的JavaFX應(yīng)用,如Groovy

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

l  JavaFX擴(kuò)展了Java集合庫,加入了observable lists和maps。這允許應(yīng)用程序?qū)I和數(shù)據(jù)模型進(jìn)行連接,UI可以觀測數(shù)據(jù)模型的改變并進(jìn)行直接更新。

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

圖形系統(tǒng)

在圖1中用藍(lán)色的部分是JavaFX圖形系統(tǒng)。它是JavaFX場景層的下層細(xì)節(jié)實(shí)現(xiàn)。它為2D和3D的場景提供支持。當(dāng)系統(tǒng)的圖形硬件設(shè)備無法支持硬件渲染的時(shí)候,它提供軟件渲染支持。

在JavaFX平臺上實(shí)現(xiàn)了兩個(gè)圖形加速管道:

l  Prism:Prism處理渲染工作。他的渲染工作,包括3D渲染,都可以運(yùn)行在硬件和軟件渲染單元之上。它負(fù)責(zé)處理光柵和渲染JavaFX場景。基于所使用的設(shè)備的不同,可能有以下的渲染途徑:

n  在Windows XP和Vista下使用DirectX 9

n  在Windows 7下使用DirectX 11

n  在Mac,Linux,嵌入式系統(tǒng)上使用OpenGL

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

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

l  Quantum Toolkit:Quantum Toolkit將Prism和Glass窗口工具結(jié)合在一起并使在整個(gè)JavaFX層次結(jié)構(gòu)中上層組件可用。它也同時(shí)管理著與事件處理相對的渲染線程規(guī)則。

Glass窗口工具

在圖1中間所示的Glass窗口工具是JavaFX 2.0圖形棧中最底層的框架。他的主要責(zé)任是提供本地系統(tǒng)服務(wù),比如說控制窗口,計(jì)時(shí)器或外觀。它作為平臺依賴層銜接著JavaFX平臺和操作系統(tǒng)。

Glass工具包也為事件隊(duì)列提供管理功能。不同于AWT管理其自身所具有的事件隊(duì)列,Glass工具包使用操作系統(tǒng)事件隊(duì)列去管理線程。同樣不同于AWT的是,Glass工具包與JavaFX應(yīng)用運(yùn)行于同一線程。而在AWT中,原生AWT運(yùn)行于一個(gè)線程而Java層次運(yùn)行于另一個(gè)線程。這樣會帶來許多問題,而JavaFX使用單一JavaFX線程來解決這類問題。

線程

任何時(shí)候,整個(gè)JavaFX系統(tǒng)都運(yùn)行于兩個(gè)以上的線程:

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

l  Prism渲染線程(Prism Render Thread):這個(gè)線程只處理渲染工作,而不干預(yù)事件派發(fā)線程。它允許第N幀播放時(shí)的同時(shí),N+1幀正在被處理。這種能力對于提高并發(fā)處理能力有著極大地好處,尤其是在現(xiàn)代的多處理器系統(tǒng)中尤為出色。Prism渲染線程也可以開啟多個(gè)光柵線程去幫助分擔(dān)渲染工作。

l  媒體線程(Media Thread):這個(gè)線程運(yùn)行于后臺并通過JavaFX應(yīng)用程序線程所使用的場景來同步最新的幀。

脈搏(Pulse)

脈搏(Pulse,先這么翻譯吧,等官方翻譯出來再修改,其本質(zhì)就是Repaint信號)是JavaFX應(yīng)使用Prism去同步場景和場景中的元素狀態(tài)的標(biāo)志。脈搏的最大速度為60幀/秒(FPS),而且無論何時(shí)只要場景中的動畫進(jìn)行,那么就會發(fā)送脈搏通知。即使動畫沒有進(jìn)行,當(dāng)場景發(fā)生改變,也會發(fā)送脈搏通知。例如,當(dāng)一個(gè)按鈕的位置發(fā)生了變化,那么就會安排一個(gè)脈搏通知。

當(dāng)發(fā)送脈搏信號后,場景中的元素的狀態(tài)就會根據(jù)渲染層進(jìn)行同步。脈搏可以使應(yīng)用程序開發(fā)者對于事件進(jìn)行異步處理。這個(gè)重要的特點(diǎn)使得系統(tǒng)可以在一個(gè)脈搏來臨前將事件進(jìn)行批量處理。

布局管理和CSS也關(guān)聯(lián)于脈搏信號。場景的眾多變化可能導(dǎo)致多次布局或CSS的更新,這種更新會導(dǎo)致性能的降低。JavaFX系統(tǒng)會自動地在每次脈搏信號來臨時(shí)將CSS或布局進(jìn)行發(fā)送,從而避免系統(tǒng)性能下降。應(yīng)用程序開發(fā)人員也可以手動觸發(fā)布局或CSS變更通知的發(fā)送。

Glass窗口工具負(fù)責(zé)使用高性能的系統(tǒng)原生計(jì)時(shí)器來發(fā)送脈搏信號。

媒體與圖像

JavaFX媒體功能是通過javafx.scene.media API實(shí)現(xiàn)的。JavaFX提供顯示和音頻媒體功能。支持MP3,AIFF,WAV音頻文件和FLV視頻文件。JavaFX媒體功能由三個(gè)組件提供:媒體對象代表著媒體文件,媒體播放器用來播放媒體文件,媒體視圖是代表著媒體的節(jié)點(diǎn)。

在圖1中綠色的部分是媒體引擎組件,這部分已經(jīng)在JavaFX 2.0中被完全重新設(shè)計(jì)了,增加了性能和穩(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應(yīng)用中實(shí)現(xiàn)以下功能:

l  渲染本地或遠(yuǎn)程的HTML內(nèi)容

l  支持歷史功能,并提供前進(jìn)和后退導(dǎo)航

l  重新載入內(nèi)容

l  向Web組件增加效果

l  編輯HTML內(nèi)容

l  執(zhí)行JavaScript命令

l  處理事件

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

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

l  WebView 封裝了一個(gè)WebEngine對象,可將HTML內(nèi)容放入應(yīng)用程序場景中,并提供域和方法來應(yīng)用效果和變換。它是Node類的子類。

你可以閱讀Adding HTML Content to JavaFX Applications文檔來獲取更多的關(guān)于JavaFX嵌入式瀏覽器的細(xì)節(jié)。

CSS

在JavaFX中CSS提供了對于JavaFX中UI應(yīng)用定制樣式而無需改變代碼的能力。CSS可以被異步地應(yīng)用于任何JavaFX場景中的節(jié)點(diǎn)。JavaFX CSS樣式也可以在運(yùn)行期間被簡單地賦予場景,并允許動態(tài)修改應(yīng)用程序外觀。

圖2顯示了同一應(yīng)用程序在兩個(gè)不同CSS樣式下的效果:

CSS樣式范例
 

圖2 CSS樣式范例

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

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

UI控件

JavaFX中UI控件可以通過使用場景中的節(jié)點(diǎn)的API來實(shí)現(xiàn)。它們從JavaFX平臺的豐富的可視化特點(diǎn)中獲得優(yōu)勢并在跨平臺時(shí)有著輕微的不同。JavaFX CSS允許為UI控件定制主題和皮膚。

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

JavaFX UI控件范例
 

圖3 JavaFX UI控件范例

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

布局

布局容器或窗格可被用于在JavaFX應(yīng)用程序場景中動態(tài)、靈活地管理UI控件。JavaFX布局API包括以下容器類,這些類可以自動進(jìn)行布局:

l  BorderPane將其內(nèi)容節(jié)點(diǎn)分布于上、下、左、右、中間位置。

l  HBox將其內(nèi)容節(jié)點(diǎn)水平布局于一行中

l  VBox將其內(nèi)容節(jié)點(diǎn)垂直布局于一列中

l  StackPane將其內(nèi)容節(jié)點(diǎn)以從后到前的順序布局于一個(gè)棧中

l  GridPane允許開發(fā)人員創(chuàng)建靈活行列數(shù)目的格子,并在格子中存放內(nèi)容節(jié)點(diǎn)

l  FlowPane將其內(nèi)容節(jié)點(diǎn)在水平方向或垂直方向上按順序布局,并以特定寬度和高度的邊界進(jìn)行包裹。

l  TilePane將其內(nèi)容節(jié)點(diǎn)布局于一致大小的單元中。

l  AnchorPane允許開發(fā)人員在上下左右或者中間創(chuàng)建錨節(jié)點(diǎn)。

在JavaFX應(yīng)用中,想要實(shí)現(xiàn)希望的布局效果,可以綜合使用不同的容器。

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

2D和3D變換

在JavaFX場景中的每個(gè)節(jié)點(diǎn)都可以使用javafx.scene.transform(原文這里應(yīng)該是打錯(cuò)了)進(jìn)行二維坐標(biāo)變換:

l  平移變換(translate):將一個(gè)節(jié)點(diǎn)從一個(gè)地方根據(jù)初始位置移動到另一個(gè)地方

l  拉伸變換(scale):將一個(gè)節(jié)點(diǎn)根據(jù)縮放因子進(jìn)行縮放

l  扭曲變換(shear):將一個(gè)節(jié)點(diǎn)根據(jù)不垂直的x、y軸進(jìn)行旋轉(zhuǎn)。

l  旋轉(zhuǎn)變換(rotate):將一個(gè)節(jié)點(diǎn)根據(jù)場景中的某個(gè)點(diǎn)進(jìn)行旋轉(zhuǎn)

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

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

視覺效果

在JavaFX場景中使用視覺效果可以提升JavaFX應(yīng)用的觀賞度。JavaFX效果主要是基于圖像點(diǎn)的,因此他可以應(yīng)用于場景中的一組節(jié)點(diǎn),像圖像一樣渲染節(jié)點(diǎn)并對其應(yīng)用指定效果。

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

l  陰影(Drop Shadow):在給定的內(nèi)容背后渲染陰影。

l  反射(Reflection):在內(nèi)容的下面渲染反射效果

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

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

部署

JavaFX應(yīng)用可以通過三種不同的方式被部署于桌面或在瀏覽器中:

l  獨(dú)立(Standalone):JavaFX應(yīng)用被安裝在本地磁盤中,并通過雙擊JAR文件來啟動。當(dāng)用戶無需進(jìn)行線上訪問或應(yīng)用沒有線上功能時(shí),這種模式是最理想的。

l  瀏覽器(Browser):在這種模式下,JavaFX應(yīng)用被嵌入一個(gè)Web頁中并隨著Web頁被訪問而自動啟動。它可以跟Web頁中JavaScript進(jìn)行交互。

l  網(wǎng)頁啟動(Web Start):這種模式下,用戶下載應(yīng)用程序并在本地運(yùn)行。一旦被下載,用戶在此之后就可以通過雙擊JNLP文件來啟動應(yīng)用。

你可以閱讀Deploying JavaFX Applications document文檔來查看更多關(guān)于三種模式和如何準(zhǔn)備JavaFX應(yīng)用部署的信息。

原文地址:http://download.oracle.com/javafx/2.0/architecture/jfxpub-architecture.htm

關(guān)鍵詞:JavaFX架構(gòu)框架java