第 4 課:創建圖形對象
JavaFX GUI 簡介對 JavaFX 中提供的豐富的內置圖形、組件和效果集合進行了介紹。但是,如何使用這些元素爲您的應用程序定製或創建更豐富的畫面?本課向您介紹瞭如何組合幾個簡單的元素來創建一個具有明暗效果的按鈕,該按鈕會投下映像,就像放在一個可以產生反射的表面上一樣。一旦您理解了結合使用不同元素的概念,就可以讓您的奇思妙想成爲現實。 |
- | 創建應用程序窗口 |
- | 設置場景 |
- | 指定組 |
- | 創建矩形 |
- | 填充矩形 |
- | 添加“錄製”指示器 |
- | 應用反射圖形效果 |
- | 運行示例 |
您已經瞭解了足夠多的 JavaFX 語言知識,可以開始創建更爲複雜的圖形對象並應用效果了。此部分介紹了使用 JavaFX Script 創建圖形的典型過程。在本課中,您將爲音頻播放器創建一個設計方案,其中包括如下圖所示的“錄製”按鈕。
要創建此按鈕,可以從各種 JavaFX 對象和功能(如 JavaFX GUI 簡介一課中所述)中進行選擇。這些對象和功能包括:矩形、圓、漸變效果和反射效果。然後,您可以組合這些功能以生成所需的按鈕圖形。
注意:本課使用 JavaFX 語言中有限數量的圖形功能。您可以結合使用其他效果和功能來創建 UI 元素,如滑塊、進度條、按鈕和搜索字段。
創建一個擴展名爲 .fx
的文件,例如 FXRecordButton.fx
。避免使用與現有的類、實例變量或保留字的名稱匹配的文件名,因爲這會在編譯過程中導致錯誤。有關現有的類、變量和保留字的更多信息,請參見 JavaFX Script API 和學習 JavaFX Script 編程語言。
您可以在任意時間使用以下命令編譯您的代碼:
javafxc FXRecordButton.fx |
您可以使用以下命令運行編譯的代碼:
javafx FXRecordButton |
爲了顯示圖形,需要創建一個窗口。
創建窗口:
- 爲
javafx.stage.Stage
類添加 import 語句。 - 聲明
Stage
對象字面值。 - 定義
Stage
對象的title
、width
、height
和visible
屬性。有關詳細信息,請參見使用聲明性語法一課。
代碼如下:
import javafx.stage.Stage; //required to render a window |
下面是此窗口的屏幕抓圖。
在 Stage
中,設置用來容納 Node
對象(如圓或矩形)的場景並使用線性漸變對其進行填充。
定義場景並使用漸變對其進行填充:
- 爲
javafx.scene.Scene
、javafx.scene.paint.LinearGradient
、javafx.scene.paint.Stop
、javafx.scene.paint.Color
類添加 import 語句。 - 聲明
Scene
對象字面值。 - 定義
Scene
對象的fill
變量。 - 在
Scene
內指定content
變量。content
變量用來容納Scene
的對象。
以下代碼用來設置場景,並使用均勻的黑白線性漸變對其進行填充:
import javafx.scene.Scene; //required to display objects of Node type such as a circle and rectangle |
- 要使用漸變填充場景,請使用
fill
實例變量,然後將LinearGradient
對象字面指定爲其值。LinearGradient
具有可用來定義漸變的方向、大小、顏色和樣式的實例變量。 startX
、startY
、endX
和endY
實例變量用來控制漸變的水平方向和垂直方向以及大小。每一個對(startX
和startY
與endX
和endY
)用來定義漸變的起點座標和終點座標。如果某個對的結束值小於同一個對的起始值,則會使漸變反向。
注意:這些變量的值依賴於下一段中所述的proportional
變量。proportional
變量用來定義startX
、startY
、endX
和endY
的值是否進行縮放。如果proportional
變量設置爲true
,則應該相對於窗口區域指定漸變的起點和終點 (0.0 - 1.0),然後在窗口中拉伸。如果proportional
變量設置爲false
,則應該將起點和終點指定爲絕對像素值,漸變將不會拉伸。
例如,如果startY
設置爲 30,endY
設置爲 100,startX
和endX
都設置爲 0,並且proportional
設置爲false
,則漸變的 Y 起點將是位於窗口標題欄下方 30 個像素位置的點,漸變的 Y 終點將是位於標題欄下方 100 個像素位置的點。如果startY
設置爲 0.5,endY
設置爲 1.0,proportional
設置爲true
,startX
和endX
都設置爲 0,則漸變的 Y 起點將是具有場景 50% 高度的 Y 值的點,Y 終點將是具有場景 100% 高度的值的點。stops
是一個Stop
變量序列,用來定義沿漸變分佈顏色的方式。Stop
的offset
變量用來定義一個點,在該點上,漸變應該是一種特定的顏色。offset
是相對於場景區域指定的,其值的範圍應該是 0.0 到 1.0。Color
變量用來定義漸變的顏色。對於Color
值,您可以指定一個顯式顏色(例如Color.WHITE
)或此顏色的 Web 代碼(例如Color.web("FFFFFF")
)。有關線性漸變的更多信息,請參見 JavaFX Script API。
有關節點和 Scene
類的更多信息,請參見在圖形場景中顯示 UI 對象一課和 JavaFX Script API。
以下屏幕抓圖顯示使用漸變填充的窗口。
現在,您可以繼續在場景中指定對象。此按鈕由一個矩形和一個圓組成。這兩個元素應該組合在一起,這樣其映像就會正確落在背景上。
組合元素:
- 爲
javafx.scene.Group
類添加 import 語句。 - 聲明
Group
對象字面值。 - 在
Group
內指定content
變量。content
變量用於容納Group
的對象。
代碼如下所示:
import javafx.scene.Group; //required to group objects to be able to operate with them as a unit |
有關 Group
類的更多信息,請參見 JavaFX Script API。
要創建按鈕輪廓線,請將一個矩形聲明爲 Group
內容的一部分。
要創建矩形,需要:
- 添加
javafx.scene.shape.Rectangle
導入。 - 聲明
Rectangle
對象字面值及其變量。有關Rectangle
類的更多信息,請參見使用聲明性語法一課和 JavaFX Script API。
下面是用來完成這兩個步驟的代碼:
import javafx.scene.shape.Rectangle; //required to render a rectangle |
這些代碼可生成以下屏幕抓圖。
使用 fill
變量對矩形由黑到白進行明暗填充。兩種顏色之間的這種均勻明暗變化稱作線性漸變。背景使用相同類型的明暗變化。
下面是用來產生該效果的代碼:
Rectangle { |
結果,此代碼在左上角 40,55 位置創建了一個矩形。此矩形位於窗口的中央,其大小是 150 x 50 像素,角圓度爲 20 和 55,並且使用黑白均勻線性漸變進行了填充。有關線性漸變的更多信息,請參見 JavaFX Script API。
此步驟的應用程序屏幕抓圖如下圖所示。
現在,您可以將紅色“錄製”指示器添加到該按鈕上。
將紅色指示器添加到該按鈕上:
- 添加
javafx.scene.shape.Circle
導入 - 使用
Circle
類聲明圓及其變量。有關Circle
類的更多信息,請參見使用聲明性語法一課和 JavaFX Script API。
注意:圓也是Group
內容定義的一部分。
下面是用來添加紅色指示器的代碼:
import javafx.scene.shape.Circle; //required to render a circle |
結果,此代碼創建了一個圓心爲 (115,80)、半徑爲 15 的圓。該圓位於矩形的中央。該圓使用紅色填充,其輪廓線爲暗紅色。以下屏幕抓圖顯示了一個上面有紅色圓的矩形。
最後一步是將“錄製”按鈕的映像添加到背景上。
應用反射效果:
- 添加
javafx.scene.effect.Reflection
import 語句。 - 使用
effect
和Reflection
變量指定效果。
這似乎是一個很難編程的步驟,但其實僅需以下幾行代碼就可以實現:
import javafx.scene.effect.Reflection; //required to apply a reflection effect |
reflection
對象字面值具有一個 fraction
實例變量,該變量用來定義在映像中可見的按鈕區域的百分比。topOpacity
變量用來定義映像的不透明性度,topOffset
用來定義按鈕底部與映像頂部之間的距離。
注意:fraction
和topOpacity
變量的取值範圍是 0.0 到 1.0。
有關反射效果的更多信息,請參見 JavaFX Script API。有關 JavaFX API 中圖形效果的完整列表,請參見 JavaFX GUI 簡介一課。
現在,您可以運行整個示例了。以下代碼是完整的 FXRecordButton.fx
文件:
import javafx.stage.Stage; |
運行此應用程序的結果如下圖所示。
本課向您展示了使用內置的 JavaFX SDK 效果和對象的組合來創建豐富的可視圖形是多麼容易。