以往要用Java做UI介面,大家會想到的是Swing,或是更早期的AWT。
AWT是Java最早用來處理桌面應用程式的API,也許是因為開發時期較早,它的架構設計的不是很好,所以在執行AWT的應用程式需要很大的系統資源,它是用native code搭配C語言寫出來的,程式碼不易被修改,也無法跨平台,因此被稱作Heavyweight元件,而且它的UI元件的美觀度也不優。
後來SWING出現後,取代了AWT,改善了UI美觀度,也改善了執行時需要大量系統資源的缺陷,它是用純Java寫出來的,所以真正可以做到跨平台,也因此被稱作Lightweight元件。目前(2018)市面上的Java教科書也多以Swing為範例來介紹Java的GUI介面,其實不管是AWT或是Swing,都已經是過時的技術了,Oracle在2007年就已經推出Java新一代的GUI介面API,叫作JavaFX。
JavaFX被定位為用來開發RIA(Rich Internet Application),中文叫作"多樣化網際網路應用程式",RIA意思大致上就是要讓網路應用程式做到擁有像桌面應用程式的行為,所以以JavaFX開發的程式,支援以Applet,桌面Application,Web Start的方式去部屬執行。也許是因為搭配Java跨平台的概念(Write Once Run Everywhere),JavaFX的程式也有著Write Once Deploy Everywhere的口號。
JavaFX不管是元件的美觀度,或是程式的執行效率,都比SWING來的更優,而且提供的UI元件也更多,可說是應有盡有,甚至還支援觸控螢幕和手勢事件,以及支援顯卡加速和3D圖形,動畫等等,大有取代Swing的氣勢。至於甚麼是顯卡加速呢? 其實就是借助GPU來協助渲染圖形,否則圖形需要以軟體來渲染,這樣速度上就會比較慢。
除此之外,JavaFX還支援CSS樣式,也就是說當應用程式要調整樣式的時候,可以只單純的修改CSS樣式表,而不去動到程式碼,這無疑是程式設計所趨向的一種模式,因為把應用程式的畫面交給了美編,那程式設計人員就專心的在處理業務邏輯或是程式流程上面,各司其職,達到加快開發,程式碼的品質也更專業,這是MVC架構的一種表現。
Oracle有為JavaFX推出一套專門處理UI的程式,叫作"Scene Builder",是免費的。它用what you see is what you get的方式,也就是可以把應用程式所需要的畫面以拖拉的方式產生出來,存成一份fxml檔案,在程式中去讀取這份fxml檔案,畫面就會自動幫我們建構出來,十分方便。但是在出了Scene Builder 1.0和2.0之後,Oracle在Java 8 update 40版時,就宣布不再更新Scene Builder,而是將原始碼發佈在OpenJFX project,讓社群去維護,目前接手維護的是一家叫Gluon的公司,繼Scene Builder 2.0開始接手後,推出了Scene Builder 8.0之後的版本,也都是免費的。
聽起來JavaFX這麼多優點,推出時一定被廣大Java程式設計師所接受,其實不然。原因是因為JavaFX一開始在1.0時是以JavaFX Script的語法去實作,這不同於傳統Java的語法,而且JavaFX當初的SDK並不內建在JRE中,所使用的編譯器和直譯器也和傳統Java的不同,這就增加了進入的門檻與降低了使用的意願。
下圖是JavaFX Script語法(左)和Java語法(右)的一個對比範例,他們進行同樣的功能:
import javafx.scene.Scene;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;
Stage {
title: "Hello World" width: 250 height: 80 scene: Scene { content: Text { font : Font { size : 24 } x: 10, y: 30 content: "Hello World" } } } |
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;
Text text = new Text("Hello World");
text.setFont(new Font(24));
text.setLayoutX(10);
text.setLayoutY(30);
Pane pane = new Pane(text);
Scene scene = new Scene(pane);
primaryStage.setWidth(250);
primaryStage.setHeight(80);
primaryStage.setTitle("Hello World");
primaryStage.setScene(scene);
primaryStage.show();
|
Oracle也明白這點,先是在JavaFX 2.0版做了改善,以傳統的Java語法取代了JavaFX Script語法,再到JavaFX 2.2版時把JavaFX的編譯器和直譯器與Java的編譯器和直譯器結合為一,再來到Java 7 update 6版時把JavaFX放到Java中,也就是說,把JavaFX當成是一個函式庫使用,現在安裝了Java之後就可以直接使用JavaFX,不需要再去安裝JavaFX的編/直譯器,不需要另外去把jfxrt.jar給include進來專案,不需要另外去學習JavaFX Script語法,這時JavaFX才逐漸被大家所接受。Oracle在Java 8開始,更是把JavaFX的版本號與Java的版本號統一,所以JavaFX在2.2版之後,就改為JavxFX 8了,可見Oracle對JavaFX的重視程度,希望JavaFX長久發展下去。
除了以上所提及的優點,JavaFX還有一個為人所樂道的Property機制,這我們未來再對這東西進行介紹。
Java的強項並不是在UI上,但是從JavaFX身上,我們還是可以看見,Java並沒有完全的放棄掉GUI,雖然也許還不及其它的GUI框架,但至少JavaFX對於絕大多數的UI效果與應用來說已經綽綽有餘了。
沒有留言:
張貼留言