145. Swing 与 JavaFX 比较

一、概述

Swing 简介

定义

Swing 是 Java 提供的一个轻量级 GUI 工具包,属于 Java Foundation Classes (JFC) 的一部分。它基于 AWT(Abstract Window Toolkit)构建,但完全用 Java 实现,不依赖本地操作系统的 GUI 组件,因此具有跨平台一致性。

核心特点

纯 Java 实现:不依赖本地 GUI,确保跨平台外观一致。

可插拔外观(Pluggable Look and Feel):支持更换界面风格(如 Windows、Metal、Nimbus)。

丰富的组件库:包括 JButton、JTable、JTree 等高级组件。

MVC 架构:组件设计遵循模型-视图-控制器模式,便于扩展。

使用场景

开发桌面应用程序(如工具软件、小型管理系统)。

需要快速原型设计的场景(因开发简单)。

对跨平台一致性要求高的项目。

示例代码

import javax.swing.*;

public class SimpleSwingApp {

public static void main(String[] args) {

JFrame frame = new JFrame("Swing示例");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JButton button = new JButton("点击我");

button.addActionListener(e -> JOptionPane.showMessageDialog(frame, "Hello Swing!"));

frame.getContentPane().add(button);

frame.setSize(300, 200);

frame.setVisible(true);

}

}

注意事项

线程安全:Swing 组件只能在事件调度线程(EDT)中更新,否则需使用 SwingUtilities.invokeLater()。

性能问题:复杂界面可能出现渲染延迟。

现代性不足:视觉效果较 JavaFX 陈旧,缺乏硬件加速支持。

常见误区

错误地在主线程直接操作 GUI(应通过 EDT)。

过度嵌套布局管理器导致性能下降。

混淆 AWT 和 Swing 组件混用(如 Button vs JButton)。

JavaFX 简介

定义

JavaFX 是 Oracle 推出的现代化 GUI 框架,用于构建跨平台的富客户端应用程序。它作为 Java SE 的一部分,旨在替代 Swing,提供更强大的图形、动画和多媒体支持。

核心特性

声明式 UI:通过 FXML(XML 格式)分离界面设计与逻辑代码。

硬件加速:基于 GPU 渲染,性能优于 Swing 的 CPU 渲染。

内置控件库:提供丰富的 UI 控件(如 TableView、WebView)和 CSS 样式支持。

多媒体支持:直接集成音频、视频和 3D 图形功能。

使用场景

需要复杂动画或视觉效果的应用(如数据可视化仪表盘)。

跨平台桌面应用开发(支持 Windows、macOS、Linux)。

与现代化技术栈整合(如通过 WebView 嵌入 HTML5 内容)。

示例代码(简单窗口)

import javafx.application.Application;

import javafx.scene.Scene;

import javafx.scene.control.Button;

import javafx.scene.layout.StackPane;

import javafx.stage.Stage;

public class HelloJavaFX extends Application {

@Override

public void start(Stage primaryStage) {

Button btn = new Button("Click Me");

StackPane root = new StackPane(btn);

Scene scene = new Scene(root, 300, 200);

primaryStage.setScene(scene);

primaryStage.show();

}

public static void main(String[] args) {

launch(args);

}

}

注意事项

模块化要求:JavaFX 11+ 需单独作为模块引入(非 JDK 内置)。

移动端限制:官方未提供对 Android/iOS 的完整支持(需第三方库如 Gluon)。

学习曲线:相比 Swing,需掌握 FXML、CSS 和属性绑定等新概念。

Swing 的发展历史

起源与背景

1997年:作为 Java 基础类库(JFC)的一部分发布,旨在替代 AWT(Abstract Window Toolkit)。

目标:提供纯 Java 实现的轻量级组件,解决 AWT 依赖本地图形库的兼容性问题。

关键版本演进

Java 1.2(1998年):正式引入 Swing,支持可插拔外观(Pluggable Look-and-Feel)。

Java 5(2004年):优化性能,增强组件(如 JTable 的排序功能)。

后续维护:2014年后进入维护模式,仅修复 bug,不再新增功能。

现状

仍内置于 JDK,但官方推荐转向 JavaFX。

JavaFX 的发展历史

起源与背景

2008年:由 Sun Microsystems 推出,最初为闭源项目(JavaFX 1.0)。

目标:解决 Swing 的现代化不足问题,支持富客户端应用开发(如动画、3D)。

关键版本演进

JavaFX 2.0(2011年):转为开源,基于原生渲染引擎(Prism),并集成到 JDK 7。

Java 8(2014年):成为 JDK 标准组件,取代 Swing 的官方推荐地位。

Java 11(2018年):从 JDK 剥离为独立模块(需单独下载)。

现状

由 OpenJFX 社区维护,持续更新(如支持高分辨率屏、WebAssembly)。

对比总结

维度

Swing

JavaFX

诞生时间

1997年(稳定但陈旧)

2008年(现代化设计)

技术栈

纯 Java 2D 渲染

硬件加速(Prism 引擎)

维护状态

仅修复 Bug

社区活跃,持续迭代

官方态度

保留但不推荐

当前首选 GUI 框架

注意:Swing 适合维护旧项目,新项目建议优先选择 JavaFX。

二、架构设计

Swing 的架构特点

1. 轻量级组件

Swing 组件是纯 Java 实现(不依赖本地平台 GUI),通过 Java2D 绘制界面。与 AWT 不同,Swing 的按钮、文本框等不依赖操作系统原生控件,因此具有更好的跨平台一致性。

2. 基于 MVC 设计模式

Swing 采用模型-视图-控制器(MVC)架构分离数据、显示和逻辑:

模型(Model):存储组件状态(如 JTable 的数据)

视图(View):负责渲染组件外观

控制器(Controller):处理用户输入事件

示例:JTable 的 MVC 实现

DefaultTableModel model = new DefaultTableModel(data, columnNames); // Model

JTable table = new JTable(model); // View & Controller

3. 可插拔外观(Pluggable Look-and-Feel)

通过 UIManager.setLookAndFeel() 可动态切换界面风格,支持:

跨平台默认风格(Metal)

系统仿真风格(Windows、GTK+)

自定义皮肤(如 Substance)

4. 事件分发线程(EDT)

Swing 要求所有 UI 操作在 Event Dispatch Thread 中执行,非线程安全。更新组件时必须使用:

SwingUtilities.invokeLater(() -> {

label.setText("更新内容"); // 线程安全操作

});

5. 组件层次结构

顶层容器:JFrame、JDialog

中间容器:JPanel、JScrollPane

基础控件:JButton、JTextField

通过 getContentPane().add() 管理组件层级

6. 绘图机制

自定义绘制需重写 paintComponent() 方法:

class MyPanel extends JPanel {

@Override

protected void paintComponent(Graphics g) {

super.paintComponent(g);

g.drawString("自定义绘制", 10, 20);

}

}

7. 布局管理器

采用布局管理器(如 BorderLayout、GridBagLayout)实现动态排版,而非固定坐标。可通过 setLayout(null) 关闭(但不推荐)。

JavaFX 的架构特点

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

定义:JavaFX 使用树状结构的场景图(Scene Graph)来组织 UI 组件,每个节点(Node)可以是控件、图形或容器。

特点:

层级结构:父子节点关系决定了渲染顺序和布局逻辑。

高效渲染:仅更新变化的节点,优化性能。

支持变换与特效:内置旋转、缩放、模糊等效果。

2. 分离的 UI 与逻辑(FXML + Controller)

FXML:基于 XML 的标记语言,用于声明式定义界面布局。

Controller:通过 @FXML 注解绑定 UI 组件与业务逻辑,实现 MVC 模式。

示例: