
- JavaFX 教程
- JavaFX - 首頁
- JavaFX - 概述
- JavaFX 安裝與架構
- JavaFX - 環境
- JavaFX - 使用 Netbeans 安裝
- JavaFX - 使用 Eclipse 安裝
- JavaFX - 使用 Visual Studio Code 安裝
- JavaFX - 架構
- JavaFX - 應用程式
- JavaFX 2D 形狀
- JavaFX - 2D 形狀
- JavaFX - 繪製線條
- JavaFX - 繪製矩形
- JavaFX - 繪製圓角矩形
- JavaFX - 繪製圓形
- JavaFX - 繪製橢圓
- JavaFX - 繪製多邊形
- JavaFX - 繪製折線
- JavaFX - 繪製三次貝塞爾曲線
- JavaFX - 繪製二次貝塞爾曲線
- JavaFX - 繪製弧形
- JavaFX - 繪製 SVGPath
- JavaFX 2D 物件的屬性
- JavaFX - 描邊型別屬性
- JavaFX - 描邊寬度屬性
- JavaFX - 描邊填充屬性
- JavaFX - 描邊屬性
- JavaFX - 描邊連線屬性
- JavaFX - 描邊斜接限制屬性
- JavaFX - 描邊端點屬性
- JavaFX - 平滑屬性
- JavaFX 路徑物件
- JavaFX - 路徑物件
- JavaFX - LineTo 路徑物件
- JavaFX - HLineTo 路徑物件
- JavaFX - VLineTo 路徑物件
- JavaFX - QuadCurveTo 路徑物件
- JavaFX - CubicCurveTo 路徑物件
- JavaFX - ArcTo 路徑物件
- JavaFX 顏色和紋理
- JavaFX - 顏色
- JavaFX - 線性漸變圖案
- JavaFX - 徑向漸變圖案
- JavaFX 文字
- JavaFX - 文字
- JavaFX 效果
- JavaFX - 效果
- JavaFX - 顏色調整效果
- JavaFX - 顏色輸入效果
- JavaFX - 影像輸入效果
- JavaFX - 混合效果
- JavaFX - 光暈效果
- JavaFX - 輝光效果
- JavaFX - 方框模糊效果
- JavaFX - 高斯模糊效果
- JavaFX - 運動模糊效果
- JavaFX - 反射效果
- JavaFX - 棕褐色效果
- JavaFX - 陰影效果
- JavaFX - 投影效果
- JavaFX - 內陰影效果
- JavaFX - 照明效果
- JavaFX - 光源.遠光效果
- JavaFX - 光源.聚光效果
- JavaFX - 光源.點光效果
- JavaFX - 位移對映
- JavaFX - 透視變換
- JavaFX 動畫
- JavaFX - 動畫
- JavaFX - 旋轉過渡
- JavaFX - 縮放過渡
- JavaFX - 平移過渡
- JavaFX - 淡入淡出過渡
- JavaFX - 填充過渡
- JavaFX - 描邊過渡
- JavaFX - 順序過渡
- JavaFX - 並行過渡
- JavaFX - 暫停過渡
- JavaFX - 路徑過渡
- JavaFX 影像
- JavaFX - 影像
- JavaFX 3D 形狀
- JavaFX - 3D 形狀
- JavaFX - 建立長方體
- JavaFX - 建立圓柱體
- JavaFX - 建立球體
- 3D 物件的屬性
- JavaFX - 剔除面屬性
- JavaFX - 繪製模式屬性
- JavaFX - 材質屬性
- JavaFX 事件處理
- JavaFX - 事件處理
- JavaFX - 使用便捷方法
- JavaFX - 事件過濾器
- JavaFX - 事件處理器
- JavaFX UI 控制元件
- JavaFX - UI 控制元件
- JavaFX - ListView
- JavaFX - Accordion
- JavaFX - ButtonBar
- JavaFX - ChoiceBox
- JavaFX - HTMLEditor
- JavaFX - MenuBar
- JavaFX - Pagination
- JavaFX - ProgressIndicator
- JavaFX - ScrollPane
- JavaFX - Separator
- JavaFX - Slider
- JavaFX - Spinner
- JavaFX - SplitPane
- JavaFX - TableView
- JavaFX - TabPane
- JavaFX - ToolBar
- JavaFX - TreeView
- JavaFX - Label
- JavaFX - CheckBox
- JavaFX - RadioButton
- JavaFX - TextField
- JavaFX - PasswordField
- JavaFX - FileChooser
- JavaFX - Hyperlink
- JavaFX - Tooltip
- JavaFX - Alert
- JavaFX - DatePicker
- JavaFX - TextArea
- JavaFX 圖表
- JavaFX - 圖表
- JavaFX - 建立餅圖
- JavaFX - 建立折線圖
- JavaFX - 建立面積圖
- JavaFX - 建立柱狀圖
- JavaFX - 建立氣泡圖
- JavaFX - 建立散點圖
- JavaFX - 建立堆疊面積圖
- JavaFX - 建立堆疊柱狀圖
- JavaFX 佈局面板
- JavaFX - 佈局面板
- JavaFX - HBox 佈局
- JavaFX - VBox 佈局
- JavaFX - BorderPane 佈局
- JavaFX - StackPane 佈局
- JavaFX - TextFlow 佈局
- JavaFX - AnchorPane 佈局
- JavaFX - TilePane 佈局
- JavaFX - GridPane 佈局
- JavaFX - FlowPane 佈局
- JavaFX CSS
- JavaFX - CSS
- JavaFX 中的媒體
- JavaFX - 處理媒體
- JavaFX - 播放影片
- JavaFX 有用資源
- JavaFX - 快速指南
- JavaFX - 有用資源
- JavaFX - 討論
JavaFX - 應用程式
正如我們已經學到的,JavaFX 是一個開源的免費軟體平臺,它允許使用者開發在各種裝置上都能一致執行的客戶端應用程式。使用 JavaFX,可以建立圖形使用者介面應用程式 (GUI) 以及網際網路或桌面應用程式。所有這些應用程式都將使用 Java 開發。
在本章中,我們將詳細討論 JavaFX 應用程式的結構,並學習透過示例建立 JavaFX 應用程式。
JavaFX 應用程式結構
通常,一個 JavaFX 應用程式將包含三個主要元件,即 **Stage、Scene** 和 **Nodes**,如下圖所示。

Stage
Stage(視窗)包含 JavaFX 應用程式的所有物件。它由 **javafx.stage** 包中的 **Stage** 類表示。主 Stage 由平臺本身建立。建立的 Stage 物件作為引數傳遞給 **Application** 類的 **start()** 方法(下一節將解釋)。
Stage 有兩個引數決定其位置,即 **寬度** 和 **高度**。它分為內容區域和裝飾(標題欄和邊框)。
有五種可用的 Stage 型別:
- 帶裝飾
- 無裝飾
- 透明
- 統一
- 實用
您必須呼叫 **show()** 方法以顯示 Stage 的內容。
Scene
Scene 表示 JavaFX 應用程式的物理內容。它包含場景圖的所有內容。**javafx.scene** 包中的 **Scene** 類表示 Scene 物件。在任何例項中,Scene 物件僅新增到一個 Stage 中。
您可以透過例項化 Scene 類來建立 Scene。您可以透過將 Scene 的尺寸(高度和寬度)以及 **根節點** 傳遞給其建構函式來選擇 Scene 的大小。
場景圖和節點
**場景圖** 是一種樹形資料結構(分層結構),表示 Scene 的內容。相反,**節點** 是場景圖中的一個視覺/圖形物件。
節點可能包括:
幾何(圖形)物件(2D 和 3D),例如:圓形、矩形、多邊形等。
UI 控制元件,例如:按鈕、複選框、選擇框、文字區域等。
容器(佈局面板),例如:BorderPane、GridPane、FlowPane 等。
媒體元素,例如音訊、影片和影像物件。
**javafx.scene** 包中的 **Node** 類表示 JavaFX 中的節點,此類是所有節點的超類。
節點有三種類型:
**根節點** - 第一個場景圖稱為根節點。
**分支節點/父節點** - 帶有子節點的節點稱為分支/父節點。名為 **javafx.scene** 包中的 **Parent** 的抽象類是所有父節點的基類,這些父節點將是以下型別:
**Group** - Group 節點是一個集合節點,包含子節點列表。每當渲染 Group 節點時,都會按順序渲染其所有子節點。應用於 Group 的任何變換、效果狀態都將應用於所有子節點。
**Region** - 它是所有基於 JavaFX Node 的 UI 控制元件的基類,例如 Chart、Pane 和 Control。
**WebView** - 此節點管理 Web 引擎並顯示其內容。
**葉子節點** - 沒有子節點的節點稱為葉子節點。例如,Rectangle、Ellipse、Box、ImageView、MediaView 是葉子節點的示例。
必須將根節點傳遞給場景圖。如果將 Group 作為根傳遞,則所有節點都將被剪裁到 Scene,並且 Scene 大小的任何更改都不會影響 Scene 的佈局。
建立 JavaFX 應用程式
要建立 JavaFX 應用程式,您需要例項化 Application 類並實現其抽象方法 **start()**。在此方法中,我們將編寫 JavaFX 應用程式的程式碼。
Application 類
**javafx.application** 包中的 **Application** 類是 JavaFX 中應用程式的入口點。要建立 JavaFX 應用程式,您需要繼承此類並實現其抽象方法 **start()**。在此方法中,您需要編寫 JavaFX 圖形的全部程式碼。
在 **main** 方法中,您必須使用 **launch()** 方法啟動應用程式。此方法在內部呼叫 Application 類的 **start()** 方法,如下面的程式所示。
示例
public class JavafxSample extends Application { @Override public void start(Stage primaryStage) throws Exception { /* Code for JavaFX application. (Stage, scene, scene graph) */ } public static void main(String args[]){ launch(args); } }
在 **start()** 方法中,為了建立一個典型的 JavaFX 應用程式,您需要按照以下步驟操作:
使用所需的節點準備場景圖。
使用所需的尺寸準備 Scene,並將場景圖(場景圖的根節點)新增到其中。
準備 Stage,並將 Scene 新增到 Stage,並顯示 Stage 的內容。
準備場景圖
根據您的應用程式,您需要使用所需的節點準備場景圖。由於根節點是第一個節點,因此您需要建立一個根節點。作為根節點,您可以從 **Group、Region 或 WebView** 中選擇。
**Group** - Group 節點由名為 **Group** 的類表示,該類屬於 **javafx.scene** 包,您可以透過例項化此類來建立 Group 節點,如下所示。
Group root = new Group();
**Group** 類的 **getChildren()** 方法為您提供了一個 **ObservableList** 類的物件,該物件儲存節點。我們可以檢索此物件並向其中新增節點,如下所示。
//Retrieving the observable list object ObservableList list = root.getChildren(); //Setting the text object as a node list.add(NodeObject);
我們也可以將 Node 物件新增到 Group 中,只需在例項化時將它們傳遞給 **Group** 類及其建構函式,如下所示。
Group root = new Group(NodeObject);
**Region** - 它是所有基於 JavaFX Node 的 UI 控制元件的基類,例如:
**Chart** - 此類是所有圖表的基類,它屬於 **javafx.scene.chart** 包。
此類有兩個子類,它們是:**PieChart** 和 **XYChart**。這兩個類又分別有子類,例如 **AreaChart、BarChart、BubbleChart** 等,用於在 JavaFX 中繪製不同型別的 XY 平面圖表。
您可以使用這些類將圖表嵌入到您的應用程式中。
**Pane** - Pane 是所有佈局面板的基類,例如 **AnchorPane、BorderPane、DialogPane** 等。此類屬於一個名為 **javafx.scene.layout** 的包。
您可以使用這些類在應用程式中插入預定義的佈局。
控制元件 - 它是使用者介面控制元件(例如手風琴、工具欄、選擇框、組合框基類、HTML 編輯器等)的基類。此類屬於包 **javafx.scene.control**。
您可以使用這些類在應用程式中插入各種 UI 元素。
在 Group 中,您可以例項化上述任何類並將其用作根節點,如下面的程式所示。
示例
//Creating a Stack Pane StackPane pane = new StackPane(); //Adding text area to the pane ObservableList list = pane.getChildren(); list.add(NodeObject);
**WebView** - 此節點管理 Web 引擎並顯示其內容。
以下是 JavaFX 節點類層次結構的圖。

準備場景
JavaFX 場景由包 **javafx.scene** 的 **Scene** 類表示。您可以透過例項化此類來建立場景,如下面的程式碼塊所示。
在例項化時,必須將根物件傳遞給場景類的建構函式。
Scene scene = new Scene(root);
您還可以傳遞兩個雙精度型別的引數,分別表示場景的高度和寬度,如下所示。
Scene scene = new Scene(root, 600, 300);
準備舞臺
這是任何 JavaFX 應用程式的容器,它為應用程式提供了一個視窗。它由包 **javafx.stage** 的 **Stage** 類表示。此類的物件作為 **Application** 類的 **start()** 方法的引數傳遞。
使用此物件,您可以在舞臺上執行各種操作。主要可以執行以下操作 -
使用 **setTitle()** 方法設定舞臺的標題。
使用 **setScene()** 方法將場景物件附加到舞臺。
使用 **show()** 方法顯示場景的內容,如下所示。
//Setting the title to Stage. primaryStage.setTitle("Sample application"); //Setting the scene to Stage primaryStage.setScene(scene); //Displaying the stage primaryStage.show();
JavaFX 應用程式的生命週期
JavaFX Application 類有三個生命週期方法,它們是 -
start() - 入口點方法,其中應編寫 JavaFX 圖形程式碼。
stop() - 一個空方法,可以重寫,在這裡您可以編寫停止應用程式的邏輯。
init() - 一個空方法,可以重寫,但不能在此方法中建立舞臺或場景。
除此之外,它還提供了一個名為 **launch()** 的靜態方法來啟動 JavaFX 應用程式。
由於 **launch()** 方法是靜態的,因此您需要從靜態上下文(通常為主方法)呼叫它。每當啟動 JavaFX 應用程式時,將執行以下操作(按相同順序)。
建立應用程式類的例項。
呼叫 **init()** 方法。
呼叫 **start()** 方法。
啟動器等待應用程式完成並呼叫 **stop()** 方法。
終止 JavaFX 應用程式
當應用程式的最後一個視窗關閉時,JavaFX 應用程式將隱式終止。您可以透過將布林值“False”傳遞給靜態方法 **setImplicitExit()** 來關閉此行為(應從靜態上下文呼叫)。
您可以使用 **Platform.exit()** 或 **System.exit**(int) 方法顯式終止 JavaFX 應用程式。
示例 - 建立一個空視窗
本節將教您如何建立一個顯示空視窗的 JavaFX 示例應用程式。以下是步驟 -
步驟 1:建立類
建立一個 Java 類並繼承包 **javafx.application** 的 **Application** 類,並實現此類的 start() 方法,如下所示。
public class JavafxSample extends Application { @Override public void start(Stage primaryStage) throws Exception { } }
步驟 2:建立 Group 物件
在 **start()** 方法中,透過例項化名為 Group 的類(屬於包 **javafx.scene**)來建立一個 Group 物件,如下所示。
Group root = new Group();
步驟 3:建立 Scene 物件
透過例項化名為 **Scene** 的類(屬於包 **javafx.scene**)來建立一個 Scene。為此類傳遞上一步建立的 Group 物件 **(root)**。
除了根物件之外,您還可以傳遞兩個雙精度型別的引數,分別表示螢幕的高度和寬度,以及 Group 類的物件,如下所示。
Scene scene = new Scene(root,600, 300);
步驟 4:設定舞臺的標題
您可以使用 **Stage** 類的 **setTitle()** 方法設定舞臺的標題。**primaryStage** 是一個 Stage 物件,作為引數傳遞給場景類的 start 方法。
使用 **primaryStage** 物件,將場景的標題設定為 **示例應用程式**,如下所示。
primaryStage.setTitle("Sample Application");
步驟 5:將 Scene 新增到 Stage
您可以使用名為 **Stage** 的類的 **setScene()** 方法將 Scene 物件新增到 Stage。使用此方法新增上一步準備的 Scene 物件,如下所示。
primaryStage.setScene(scene);
步驟 6:顯示 Stage 的內容
使用名為 **Stage** 類的 **show()** 方法顯示場景的內容,如下所示。
primaryStage.show();
步驟 7:啟動應用程式
透過從主方法呼叫 **Application** 類的靜態方法 **launch()** 來啟動 JavaFX 應用程式,如下所示。
public static void main(String args[]){ launch(args); }
以下程式生成一個空的 JavaFX 視窗。將此程式碼儲存在名為 **JavafxSample.java** 的檔案中。
示例
import javafx.application.Application; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.paint.Color; import javafx.stage.Stage; public class JavafxSample extends Application { @Override public void start(Stage primaryStage) throws Exception { //creating a Group object Group group = new Group(); //Creating a Scene by passing the group object, height and width Scene scene = new Scene(group ,600, 300); //setting color to the scene scene.setFill(Color.BROWN); //Setting the title to Stage. primaryStage.setTitle("Sample Application"); //Adding the scene to Stage primaryStage.setScene(scene); //Displaying the contents of the stage primaryStage.show(); } public static void main(String args[]){ launch(args); } }
使用以下命令從命令提示符編譯並執行儲存的 java 檔案。
javac --module-path %PATH_TO_FX% --add-modules javafx.controls JavafxSample.java java --module-path %PATH_TO_FX% --add-modules javafx.controls JavafxSample
輸出
執行後,上述程式將生成一個 JavaFX 視窗,如下所示。

示例 - 繪製直線
在前面的示例中,我們已經看到了如何建立一個空舞臺,現在在這個示例中,讓我們嘗試使用 JavaFX 庫繪製一條直線。
繪製線條的此程式碼也遵循前面示例中提到的相同步驟。但是,差異出現在 start() 方法中,我們透過例項化名為 Group 的類(屬於包 javafx.scene)來建立一個 Group 物件。將使用 setter 方法建立的 Line(節點)物件作為引數傳遞給 Group 類的建構函式,以便將其新增到組中。
將此程式碼儲存在名為 **DrawingLine.java** 的檔案中。
import javafx.application.Application; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.shape.Line; import javafx.stage.Stage; public class DrawingLine extends Application{ @Override public void start(Stage stage) { //Creating a line object Line line = new Line(); //Setting the properties to a line line.setStartX(100.0); line.setStartY(150.0); line.setEndX(500.0); line.setEndY(150.0); //Creating a Group Group root = new Group(line); //Creating a Scene Scene scene = new Scene(root, 600, 300); //Setting title to the scene stage.setTitle("Sample application"); //Adding the scene to the stage stage.setScene(scene); //Displaying the contents of a scene stage.show(); } public static void main(String args[]){ launch(args); } }
使用以下命令從命令提示符編譯並執行儲存的 java 檔案。
javac --module-path %PATH_TO_FX% --add-modules javafx.controls DrawingLine.java java --module-path %PATH_TO_FX% --add-modules javafx.controls DrawingLine
輸出
執行後,上述程式將生成一個 JavaFX 視窗,顯示一條直線,如下所示。

示例 - 顯示文字
我們還可以將文字嵌入到 JavaFX 場景中。此示例演示如何在 JavaFX 中嵌入文字。將此程式碼儲存在名為 **DisplayingText.java** 的檔案中。
import javafx.application.Application; import javafx.collections.ObservableList; import javafx.scene.Group; import javafx.scene.Scene; import javafx.stage.Stage; import javafx.scene.text.Font; import javafx.scene.text.Text; public class DisplayingText extends Application { @Override public void start(Stage stage) { //Creating a Text object Text text = new Text(); //Setting font to the text text.setFont(new Font(45)); //setting the position of the text text.setX(50); text.setY(150); //Setting the text to be added. text.setText("Welcome to Tutorialspoint"); //Creating a Group object Group root = new Group(); //Retrieving the observable list object ObservableList list = root.getChildren(); //Setting the text object as a node to the group object list.add(text); //Creating a scene object Scene scene = new Scene(root, 600, 300); //Setting title to the Stage stage.setTitle("Sample Application"); //Adding scene to the stage stage.setScene(scene); //Displaying the contents of the stage stage.show(); } public static void main(String args[]){ launch(args); } }
使用以下命令從命令提示符編譯並執行儲存的 java 檔案。
javac --module-path %PATH_TO_FX% --add-modules javafx.controls DisplayingText.java java --module-path %PATH_TO_FX% --add-modules javafx.controls DisplayingText
輸出
執行後,上述程式將生成一個 JavaFX 視窗,顯示文字,如下所示。
