使用 FXML 的基本 JavaFX 專案

這是一個使用 FXML 的基礎專案,使用 NetBeans 建立(New Project - > JavaFX - > JavaFX FXML Application)。它只包含三個檔案:

主要應用類

package org.stackoverflow;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class BasicApplication extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("BasicFXML.fxml"));

        Scene scene = new Scene(root);

        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

FXML 檔案

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns:fx="http://javafx.com/fxml/1" fx:controller="org.stackoverflow.BasicFXMLController">
    <children>
        <Button layoutX="126" layoutY="90" text="Click Me!" onAction="#handleButtonAction" fx:id="button" />
        <Label layoutX="126" layoutY="120" minHeight="16" minWidth="69" fx:id="label" />
    </children>
</AnchorPane>

調節器

package org.stackoverflow;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Label;

public class BasicFXMLController {

    @FXML
    private Label label;

    public void initialize() {
        // TODO
    }   

    @FXML
    private void handleButtonAction(ActionEvent event) {
        label.setText("Hello World!");
    }

}

構建和執行專案應該顯示一個帶有可點選按鈕的小視窗:

StackOverflow 文件

這個怎麼運作

簡而言之,在主 Application 類中,FXMLLoader 將從 jar / classpath 載入 basicFXML.fxml,由 FXMLLoader.load(getClass().getResource("BasicFXML.fxml")) 指定。

載入 basicFXML.fxml 時,載入程式將找到控制器類的名稱,由 FXML 中的 fx:controller="org.stackoverflow.BasicFXMLController" 指定。

然後載入器將建立該類的例項,在該例項中,它將嘗試注入 FXML 中具有 fx:id 的所有物件,並在控制器類中標記 @FXML 註釋。

在此示例中,FXMLLoader 將基於 <Label ... fx:id="label"/> 建立標籤,並將標籤例項注入 @FXML private Label label;

最後,當載入了整個 FXML 時,FXMLLoader 將呼叫控制器的 initialize 方法,並且將執行使用該按鈕註冊動作處理程式的程式碼。

編輯

雖然可以在 IDE 中編輯 FXML 檔案,但不建議這樣做,因為 IDE 僅提供基本語法檢查和自動完成,但不提供可視指導。

最好的方法是使用 Scene Builder 開啟 FXML 檔案,其中所有更改都將儲存到檔案中。

可以啟動 Scene Builder 來開啟檔案: StackOverflow 文件

或者可以直接從 IDE 使用 Scene Builder 開啟檔案:

  • 從 NetBeans,在專案選項卡上,雙擊該檔案或右鍵單擊並選擇 Open
  • 從 IntelliJ 中,在專案選項卡上,右鍵單擊該檔案並選擇 Open In Scene Builder
  • 從 Eclipse 中,在專案選項卡上,右鍵單擊該檔案並選擇 Open with Scene Builder

StackOverflow 文件

如果正確安裝了 Scene Builder 並將其路徑新增到 IDE(請參閱下面的備註),它將開啟檔案:

StackOverflow 文件

可以通過從左窗格拖動新容器或新控制元件來進行更改,並且可以在右窗格中更改屬性和佈局值。

請注意,允許將 FXML 注入 Java 程式碼的 id 標記之一是 fx:id。它可以在 Code 窗格中設定:

StackOverflow 文件

應用更改後,儲存檔案(Scene Builder - > File - > Save)。如果在 IDE 中編輯檔案進行了更改,則在儲存檔案時,這些檔案將在 Scene Builder 上更新。