openjfx(javaFX)完整學習指南(教程)

openjfx(javaFX)介紹

基於JavaSE8,openjfx由幾個組件構成:圖形引擎Prism,窗體引擎glass,媒體引擎和一個web引擎。
歡迎大家積極開心的加入討論羣,羣號:608423839(二羣),556722677(三羣),689672017(四羣)

特性

  • FXML是一種基於XML的聲明式標記語言,用於描述JavaFX應用程序的用戶界面。設計師可以在FXML中編碼或者使用JavaFX Scene Builder來交互式地設計圖形用戶接口(GUI)。Scene Builder所生成的FXML標記可以與IDE對接,這樣開發者可以添加業務邏輯。類似安卓界面開發。
  • 它是一個使用了WebKitHTML技術的Web組件,可用於在JavaFX應用程序中嵌入Web頁面。在WebView中運行的JavaScript可以方便地調用JavaAPI,並且JavaAPI也可以調用WebView中的JavaScript。
  • 與Swing互操作:現有的Swing程序可以通過JavaFX的新特性升級,例如多媒體播放和Web 內容嵌入。在JavaFX8中加入了SwingNode類,它可以將Swing內容嵌入到JavaFX程序中。
  • 內置的UI控件和CSS:JavaFX提供了開發一個全功能應用程序所需的所有主要控件。這些組件可以使用標準的Web技術如CSS來進行裝飾。在JavaFX8中,DatePicker和TreeView UI控件是可用的,並且可以使用標準的Web技術如CSS來進行美化。
  • Modena主題:在JavaFX8中,提供了新的Modena主題來替換原來的Caspian主題。不過在Application的start()方法中,可以通過加入setUserAgentStylesheet(STYLESHEET_CASPIAN)代碼行來繼續使用Caspian主題。(eguid原創文章,轉載 請註明出處)
  • 3D圖像處理能力:在JavaFX8中的3D圖像處理API中加入了一些新的API,包括Shape3D (Box, Cylinder, MeshView和Sphere 子類),SubScene, Material, PickResult, LightBase (AmbientLight 和PointLight子類),SceneAntialiasing等。在本次發佈中Camera類API也得到了更新。
  • Canvas API:Canvas API允許在由一個圖形元素(node)組成的JavaFX場景(Scene)的一個區域中直接繪圖。
  • Printing API:JavaFX 8中加入了print包並且提供了打印功能公共類。
  • Rich Text支持:JavaFX提供了更爲強大的文本支持能力,包括雙向文字(例如阿拉伯語)、複雜文字腳本,例如Thai、Hindu文字,並且支持多行、多種風格的文本節點。
  • 多點觸摸:基於底層平臺的功能JavaFX提供了對多點觸摸的支持。
  • Hi-DPI支持:JavaFX 8現在支持Hi-DPI顯示。
  • 圖形渲染硬件加速:JavaFX圖像均基於圖形渲染流水線(Prism)。JavaFX提供更爲平滑的圖像並且在顯卡或圖像處理單元(Graphics processing unit,GPU)支持的情況下通過Prism來獲得更快的渲染速度。如果GPU不支持對應的圖形處理功能,則Prism會使用軟件渲染方式來替代。
  • 高性能多媒體引擎:媒體流水線支持對Web媒體內容的播放。它提供了一個基於GStreamer多媒體框架的穩定、低延遲的多媒體處理框架。
  • 自包含的應用部署模型:自包含應用包具有應用所需的所有資源、包括一個Java和JavaFX運行時的私有拷貝。它們可作爲操作系統原生安裝包發佈,並提供與原生應用相同的安裝和運行體驗。

架構

組件

場景圖

Scene gragh是應用的入口,他是一個層級結構的節點樹,可以處理輸入,也可以被渲染。
場景圖中的一個元素被稱爲節點,每個節點都包含一個id,樣式類和包圍盒(bounding volume)。除了根節點外,場景圖中所有節點都有一個父節點,0或多個字節帶你,節點包含以下特性:

  • 效果(Effects),模糊和陰影
  • 不透明度(Opacity)
  • 變換(Transforms)
  • 事件處理器(Event handlers,鼠標、鍵盤和輸入法)
  • 應用相關的狀態(Application-specific state)
    和Swing與AWT不同的是,場景圖還包含矩形、文本、空間、佈局容易、圖像和多媒體。
    javafx.scene api允許創建和定義各種內容,比如:
  • 節點(Nodes):形狀(2d,3d)、圖像、多媒體、內嵌web瀏覽器、文本、UI控件、圖表、組和容器。
  • 狀態(State):變換(節點定位和方向)、視覺效果、內容和其他視覺效果
  • 效果(Effects):可以改變場景圖節點的外觀,例如模糊、陰影和圖像調整。

圖形系統

圖形系統支持2d和3d場景圖,當系統中的硬件不支持時,將提供軟件渲染(也就是cpu渲染)。

  • windows xp和vista上的directx 9
  • windows 7上的directx 11
  • mac、Linux、嵌入式設備上的OpenGL
  • 當硬件不支持時使用軟件渲染(cpu渲染,內置在jre中)

Glass窗體工具包

Glass窗體工具包(Glass window toolkit)提供本地操作,例如:窗體、計時器、皮膚。它是JavaFX層與本地操作系統的平臺無關層。它還負責管理事件隊列,該事件隊列與javaFX應用在同一個線程上。AWT中本地系統中的那部分代碼運行在一個縣城裏,而Java部分運行在另外一個線程裏,導致了很多問題,這些問題在javafx中得到了解決。

線程

javafx的程序和渲染線程是分開的,應用運行時會有兩個或更多線程:

  • javafx應用程序線程(主線程,用於控制場景圖,場景圖只能由該線程來訪問,所以嵌入swing會出現問題)
  • prism渲染線程(用於處理渲染工作,與事件調度獨立,使得渲染可以與程序並行,在上一幀被系統渲染時,線程可以並行的處理下一幀)
  • 多媒體線程(在後臺運行,使用javafx應用程序線程在場景圖中同步最近的幀,像素調度線程)

線程調度結構(eguid 原創 文章,-轉載-請註明出處)
線程1 --> 線程2 --> 主線程
prism渲染 --> 多媒體線程(調度線程) --> 窗體\場景圖

脈衝(Pulse)

脈衝是一個異步事件,用於異步通知場景圖何時使用prism來同步場景圖上元素的狀態,一個脈衝被限制最多60幀/秒(fps),並且會在場景圖上運行動畫時被觸發,即使動畫沒有運行,如果場景圖中的內容發生改變,也會使脈衝被調度。
例如一個button位置被改變,脈衝就會被調度。layout和css也會觸發脈衝調度,系統在每個脈衝之上會自動進行一次css和佈局處理,來降低對系統性能的影響,場景圖中的某個改變會導致很多佈局和css的更新,這些更新會影響系統性能,可以根據需要在脈衝之前觸發佈局。
Glass windowtoolkit負責使用高分辨率的本地計時器來執行脈衝事件。

多媒體和圖像

可以通過javafx.scene.media API來訪問多媒體功能,支持視頻和音頻。格式支持mp3,aiff,wav和flv視頻。
多媒體組件由三個:

  • Meida對象-表示一個多媒體文件
  • MediaPlayer-用於播放文件
  • MediaView-用於顯示內容

web組件

web組件(Web component)是一個基於webkit的Javafx ui空間,提供了一個web viewer,並通過api提供了完全的瀏覽功能,支持全部瀏覽器功能:

  • 渲染本地或這遠程url的html內容
  • 支持歷史記錄、後退、前進導航
  • 內容重加載
  • 向web組件添加效果
  • 編輯html內容
  • 執行js腳本
  • 事件處理
    這個嵌入式的瀏覽器組件由以下類組成:
  • webEngine提供了基本的web頁面瀏覽功能
  • webview封裝了webEngine對象,並將html整合到應用場景之中,並提供屬性和方法來增加效果、變換。它是Node類的一個擴展。
  • 支持Java和js的互相調用

css

javafx支持層疊樣式表(css),其提供了在不修改程序代碼的情況下自定義應用程序外觀的能力。css可以被添加到任何場景圖中的節點之上,且這個過程時異步的。也支持在運行時添加css到場景中,這使得動態改變應用程序外觀變得可行。

注意(eguid 原創 文章,【轉載】請註明出處)
javafx 的css時基於W3C CSS標準2.1版本,對3.0版本支持較少,只有少量的css3.0特性

UI控件

javafx UI控件可以通過javafx api來使用,這些控件通過場景圖中的節點來構建。這些控件充分利用了javaFX平臺豐富的視覺功能,並且支持多種操作系統。css可以對UI控件進行主題和風格控制。

佈局

佈局容器(Layout contaniner)或者面板(Pane)可以對javafx應用程序中的UI控件進行靈活、動態排布。
Layout api包含:

  • BorderPane類將其內容節點放到上、下、左、右、中各個區域中。
  • HBox類將其內容節點橫向排成一列。
  • StackPane類將其內容節點摞在一起(可以用作遊戲裏的多層佈局)
  • GridPane類按行列來佈局內容節點,類似bootstrap
  • FlowPane類按內容行或列進行流式佈局,當遇到橫向或縱向的邊界時自動進行換行或換列。
  • TilePane類將其內容放到統一大小的單元格中。
  • AnchorPane類可以創建錨節點,將控件停靠於佈局的上下左右各邊,也可以劇中停靠。
    可以通過嵌套使用各類佈局來靈活佈局結構。

2d和3d變換

在javafx場景圖中每個節點都可以使用下面的Javafx.scene.tranform的類來進行x-y座標系變換。

  • translate - 將一個節點的xyz座標系從一個位置移動到另一個。
  • scale - 將一個節點在xyz總表系統根據縮放因子進行縮放。
  • shear - 旋轉一個座標軸,這樣x,y軸就不再是垂直的了。節點座標值會過根據制定的背書進行變換。
  • rotate - 根據scene中指定的一個支點對節點進行旋轉。
  • affine - 執行從一個2d/3d座標系到另外一個2d/3d座標系的線性映射,同時保留線條的‘straight’和‘parallel’屬性。這個類應與Translate、scale、rotate、shear變換使用,一般不要直接使用。

視覺效果

在場景圖中開發富客戶端界面,包括使用視覺效果來美化程序的外觀。javafx的視覺效果主要基於像素的圖像,因此他們需要先獲取場景圖中節點渲染成圖像,再將視覺效果添加上去。
提供下面的類來提供一些常用的視覺效果:

  • drop shadow - 應用視覺效果後將爲給定的內容渲染一個陰影。
  • reflection - 再真實的內容後面渲染一個反射倒影。
  • lighting - 模仿一個光源的照射效果,使一個平面的對象看起來更真實、具有3d效果。

測試使用

測試使用每個功能實際效果

節點

  • Node:所有場景圖節點的抽象基礎類。
  • Parent:所有分支節點的抽象基礎類。(此類直接繼承Node類)
  • Scene:場景圖中所有內容的基本容器類。

場景節點(Scene)

場景是所有內容的基本容器(eguid原創文章,轉載請註明出處)

  • 設置攝像機(Camera),用來設置可是範圍
  • 填充顏色
  • 設置鼠標樣式
  • 監聽觸摸、鼠標、鍵盤事件
  • 設置和獲取當前場景參數
	Scene.setUserData(Object obj);
	Scene.getUserData();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章