FXML 布局文件

什么是 FXML

FXML(Forms XML)是一种用于在JavaFX应用程序中定义用户界面的标记语言。它允许开发者使用XML格式来声明UI组件、布局以及它们之间的约束关系,从而简化了跨平台桌面应用程序的UI设计。

虽然可以使用FXML创建任何用户界面,但 FXML 特别适用于具有大型、复杂的场景图、表单、数据输入或复杂动画的用户界面。FXML也非常适合定义静态布局,如表单、控件和表格。

第一个 JavaFX(FXML) 程序

步骤1:创建 FXML 布局文件 hello-view.fxml

FXML 是一个 XML 文件,用于定义用户界面的结构,包括布局、控件、样式等。FXML 文件通常与 Java 代码分离,使得设计师可以专注于UI设计,而开发者可以专注于业务逻辑。

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

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>

<?import javafx.scene.control.Button?>
<VBox alignment="CENTER" spacing="20.0" xmlns:fx="http://javafx.com/fxml"
      fx:controller="com.binge.javafxdemo.HelloController">
    <padding>
        <Insets bottom="20.0" left="20.0" right="20.0" top="20.0"/>
    </padding>

    <Label fx:id="welcomeText"/>
    <Button text="Hello!" onAction="#onHelloButtonClick"/>
</VBox>
HelloController.java

每个 FXML 文件通常有一个对应的 Controller 类,它包含管理UI的逻辑代码。Controller类通常通过@FXML注解与FXML文件中的控件关联。

package com.binge.javafxdemo;

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

public class HelloController {
    @FXML
    private Label welcomeText;

    @FXML
    protected void onHelloButtonClick() {
        welcomeText.setText("Welcome to JavaFX Application!");
    }

    public void initialize() {
        welcomeText.setText("Hello World!");
    }
}
  • @FXML注解: 这是 JavaFX 提供的一个注解,用于在 Controller 类中标记那些需要与 FXML 文件中的控件绑定的字段。
  • 初始化方法: Controller 类通常包含一个initialize()方法,该方法在 FXML 文件加载完成后自动调用,用于初始化逻辑。

FXML的优势

它允许开发者将用户界面(UI)的设计与其逻辑代码分离,从而实现MVC(Model-View-Controller)架构中的视图(View)与逻辑(Controller)的分离

  • 由于FXML中的场景图更加透明,开发团队可以轻松创建和维护可测试的用户界面。
  • FXML不是一种编译语言,您不需要重新编译代码即可看到更改。

FXML 如何使用

FXML 官方文档:https://openjfx.cn/javadoc/18/javafx.fxml/javafx/fxml/doc-files/introduction_to_fxml.html

一个FXML标签代表以下类型之一:
  • 某个类的实例
  • 某个类实例的属性
  • 某个静态属性
  • 一个定义代码块
  • 一个脚本代码块
一个FXML属性表示以下类型之一:
  • 某个类实例的属性
  • 某个静态属性
  • 事件处理程序
FXML 特殊标签属性
名称 描述 举例
fx:controller 指定 FXML 文档的控制器类。控制器类包含管理 FXML UI 组件和处理事件的方法
fx:id 为 FXML 中的 UI 组件分配一个唯一的标识符,以便在控制器中引用它们
fx:include 用于包含另一个 FXML 文档的内容。这允许开发者将 UI 分割成多个较小的、可管理的文件 <fx:include source="dialog.fxml"/>
fx:define 用于定义可以在 FXML 文档中重复使用的组件或值 <fx:define> <Button fx:id="myButton" text="Click Me"/> </fx:define>
fx:value 用于设置组件属性的值,特别是当属性需要从外部资源(如资源束)加载时
fx:reference 用于引用在 FXML 文档中已定义的另一个组件
fx:root 指定 FXML 文档的根元素。这通常用于自定义控件,其中 FXML 标记是控件的一部分 <fx:root>
fx:factory 指定用于创建组件实例的工厂方法。这在处理不可变的值对象时很有用 <fx:factory>

使用这些标签和属性,开发者可以充分利用 JavaFX 的功能,创建复杂的用户界面。

Scene Builder 构建 FXML 布局文件

官方下载链接:https://openjfx.cn/scene-builder/

Scene Builder是一个可视化的布局工具,用于设计和构建JavaFX用户界面。它可以方便地在不编写代码的情况下创建和编辑FXML文件和界面元素。

点击下一步,完成安装

选择空项目

布局和组件直接拖拽进场景即可,保存后可生成对应的fxml文件。

Controller里的 initialize () 方法

有时我们是无法在 fxml 文件里填充数据的,并且有些内容需要初始化时就填充(如表格),而不是触发事件后填充,此时就可以使用initialize方法,做一些初始化的工作。

initialize() 方法需要自定义,定义完之后会自动调用,该方法调用的时机是加载好 fxml 文件,并绑定好控件 id 之后,才会自动调用一次。

注意:在initialize() 方法中无法访问 Scene 场景

IDEA FXML 插件

FXMLHelp 插件

可以根据 FXML 布局文件,生成对应 Controller 类文件。

FXMLManager 插件

当修改 FXML 布局文件后,可以自动更新 Controller 类文件代码。

posted @ 2024-06-23 13:20  Binge-和时间做朋友  阅读(248)  评论(0编辑  收藏  举报