JavaFX

JavaFX 概述

JavaFX 是 Java 的下一代 GUI 框架,用于构建富客户端应用程序。它取代了 Swing,提供了更现代化的 UI 组件和丰富的图形功能。

主要特点

  • 基于场景图(Scene Graph)的渲染模型

  • 支持硬件加速

  • 内置丰富的 UI 控件

  • 支持 CSS 样式化

  • 提供 FXML 用于界面设计与代码分离

  • 支持动画和特效

  • 跨平台运行


JavaFX 核心架构

    基于场景图(Scene Graph)的渲染:所有可视化元素(控件、形状、布局等)均继承自 Node,通过树形结构组织,支持高效的事件传递和样式管理。

    属性绑定与响应式设计:内置 Observable属性和数据绑定机制,支持 UI 与数据的自动同步,简化动态交互开发。

1. 基本结构

Application -> Stage -> Scene -> Node

2. 核心类

  • Application: JavaFX 应用的入口类

  • Stage: 窗口(顶级容器)

  • Scene: 场景(包含所有 UI 组件)

  • Node: 所有 UI 组件的基类(控件、形状、布局等)


JavaFX 应用开发基础

    继承Application类:JavaFX 应用通过继承 javafx.application.Application并重写start()方法启动,主舞台(Stage)作为根窗口承载场景(Scene)和节点(Node)。

    场景图布局:使用内置布局容器(如vBox,BorderPane)或自定义节点构建界面,通过Scene设置到Stage并调用show()显示窗口。

1. 基本应用结构

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        // 创建根节点(布局或容器)
        Pane root = new VBox();
        
        // 创建场景并设置根节点
        Scene scene = new Scene(root, 400, 300);
        
        // 设置舞台(窗口)属性
        primaryStage.setTitle("JavaFX 应用");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    
    public static void main(String[] args) {
        launch(args);
    }
}

2. 常用布局

  • BorderPane: 上、下、左、右、中五个区域

  • HBox: 水平排列子节点

  • VBox: 垂直排列子节点

  • GridPane: 网格布局

  • FlowPane: 流式布局(自动换行)

  • StackPane: 堆叠布局(子节点重叠)


JavaFX 控件

    内置丰富UI组件:JavaFX 提供多样化控件如Button、TextField、TableView等,涵盖基础输入、数据展示和交互元素,满足常见界面需求。

    样式与行为可定制:所有控件支持 CSS 美化,并可通过属性绑定(如textProperty)和事件监听(如setOnAction)动态控制外观与逻辑。

    容器与控件协同:控件需嵌入布局容器(如HBox、GridPane)实现灵活排版,结合场景图(Scene Graph)层级管理,构建结构化界面。

1. 基本控件

  • Label: 标签

  • Button: 按钮

  • TextField: 单行文本输入

  • TextArea: 多行文本输入

  • CheckBox: 复选框

  • RadioButton: 单选按钮

  • ComboBox: 下拉框

  • ListView: 列表视图

  • TableView: 表格视图

 2. 控件使用示例

Button btn = new Button("点击我");
btn.setOnAction(event -> {
    System.out.println("按钮被点击了!");
});

TextField textField = new TextField();
textField.setPromptText("请输入内容");

CheckBox checkBox = new CheckBox("同意协议");

事件处理

    事件驱动模型:JavaFX 采用事件驱动机制,通过EventHandler接口处理用户交互(如点击、键盘输入等),使用setOnXXX()方法绑定事件与逻辑。

    事件类型丰富:支持多种事件类型(ActionEvent、MouseEvent、KeyEvent等),可通过事件对象获取详细信息(如坐标、按键值),实现精准交互控制。

    Lambda 简化代码:推荐使用 Lambda 表达式或方法引用(如button.setOnAction(e -> {...}))替代匿名类,使事件处理代码更简洁易读。

1. 事件类型

  • 鼠标事件: MouseEvent

  • 键盘事件: KeyEvent

  • 动作事件: ActionEvent

  • 窗口事件: WindowEvent

2. 事件处理方式

// 1. 使用Lambda表达式
button.setOnAction(event -> {
    System.out.println("按钮被点击");
});

// 2. 使用方法引用
button.setOnAction(this::handleButtonClick);

// 3. 实现EventHandler接口
button.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent event) {
        System.out.println("按钮被点击");
    }
});

FXML 与 Scene Builder

    FXML实现界面与逻辑分离:通过XML文件定义UI布局结构,配合控制器类处理业务逻辑,实现MVC架构的清晰分工。

    Scene Builder可视化拖拽设计:图形化工具快速构建界面,自动生成FXML代码,支持属性编辑和样式预览,大幅提升开发效率。

    双向数据绑定与依赖注入:FXML支持@FXML注解自动注入组件引用,结合属性绑定机制简化数据与UI的同步更新。

1. FXML 基础

FXML 是基于 XML 的标记语言,用于定义 JavaFX 用户界面。

<!-- 示例FXML文件 -->
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<VBox xmlns="http://javafx.com/javafx/8.0.171" 
      xmlns:fx="http://javafx.com/fxml/1"
      fx:controller="com.example.MyController">
    <Label text="欢迎使用JavaFX"/>
    <Button text="点击我" onAction="#handleButtonClick"/>
</VBox>

 2. 控制器类

public class MyController {
    @FXML
    private void handleButtonClick(ActionEvent event) {
        System.out.println("按钮被点击");
    }
}

3. 加载 FXML

FXMLLoader loader = new FXMLLoader(getClass().getResource("ui.fxml"));
Parent root = loader.load();
Scene scene = new Scene(root);
primaryStage.setScene(scene);

动画与特效

    内置动画API:JavaFX 提供Transition类(如FadeTransition、TranslateTransition)和Timeline实现平滑动画效果,支持关键帧插值控制。

    预置视觉特效:通过Effect类(如 DropShadow、Blur)快速添加投影、模糊等特效,直接绑定到节点属性实现动态视觉效果。

1. 基本动画

// 平移动画
TranslateTransition tt = new TranslateTransition(Duration.seconds(2), rectangle);
tt.setFromX(0);
tt.setToX(100);
tt.play();

// 渐变动画
FadeTransition ft = new FadeTransition(Duration.seconds(3), label);
ft.setFromValue(1.0);
ft.setToValue(0.0);
ft.play();

2. 特效

// 阴影效果
DropShadow shadow = new DropShadow();
shadow.setColor(Color.GRAY);
shadow.setRadius(5);
button.setEffect(shadow);

// 模糊效果
GaussianBlur blur = new GaussianBlur();
blur.setRadius(5);
imageView.setEffect(blur);

数据绑定

响应式数据同步:JavaFX 通过Property属性体系(如StringProperty、IntegerProperty)实现数据与UI的自动双向绑定,修改数据即时刷新界面。

灵活绑定表达式:支持使用Bindings工具类创建复杂绑定逻辑(如算术运算、条件判断),或通过bind()方法建立简单单向绑定。

集合动态监听:ObservableList和ObservableMap等集合类型支持监听器,可实时响应数据增删变化并自动更新 ListView、TableView 等控件内容。

1. 属性绑定

// 简单绑定
label.textProperty().bind(textField.textProperty());

// 双向绑定
textField1.textProperty().bindBidirectional(textField2.textProperty());

// 转换绑定
label.textProperty().bind(Bindings.concat("欢迎: ", textField.textProperty()));

2. 集合绑定

ObservableList<String> items = FXCollections.observableArrayList();
listView.setItems(items);

// 添加监听器
items.addListener((ListChangeListener<String>) change -> {
    while (change.next()) {
        if (change.wasAdded()) {
            System.out.println("添加了: " + change.getAddedSubList());
        }
    }
});

常见问题

  1. JavaFX 不在 JDK 中: 从 JDK 11 开始,JavaFX 需要单独下载

  2. 线程问题: UI 更新必须在 JavaFX 应用线程中进行

  3. FXML 加载错误: 检查文件路径和控制器类配置

  4. CSS 不生效: 检查选择器是否正确,样式表是否加载

  5. 内存泄漏: 注意监听器和绑定的清理


总结

  1. JavaFX 是一个功能强大且灵活的框架,适合开发现代化的桌面应用程序。通过掌握上述知识,您可以构建出美观、响应迅速且功能丰富的 Java 客户端应用。 
  2. 基于场景图(Scene Graph)模型,采用Stage-Scene-Node结构,支持 FXML 分离界面与逻辑,并内置数据绑定和动画特效。
  3. 适合开发跨平台富客户端应用,支持响应式设计、多线程任务处理,并能通过 CSS 和自定义控件实现高度个性化的界面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值