使用 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 上更新。