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 类文件代码。