上一篇
Java中,可以使用Swing或JavaFX库来创建图形用户界面(GUI)。
Java 图形界面开发指南
Java 提供了多种方式来创建图形用户界面(GUI),主要包括 AWT、Swing 和 JavaFX,本文将详细介绍这些技术及其使用方法,帮助你掌握 Java 界面开发的核心知识。
AWT(Abstract Window Toolkit)
AWT 是 Java 最早的 GUI 工具包,提供基础的窗口组件,它依赖操作系统本地组件,因此外观与平台一致。
1 基本结构
import java.awt.;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class AWTExample extends Frame {
Button button;
public AWTExample() {
// 设置窗口属性
setTitle("AWT 示例");
setSize(300, 200);
setLayout(new FlowLayout());
// 创建按钮并添加事件监听
button = new Button("点击我");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
button.setLabel("已点击");
}
});
// 添加组件到窗口
add(button);
// 关闭窗口事件
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
dispose();
}
});
}
public static void main(String[] args) {
AWTExample frame = new AWTExample();
frame.setVisible(true);
}
}
2 常用组件
| 组件 | 说明 |
|---|---|
| Frame | 顶级窗口 |
| Button | 按钮 |
| TextField | 单行文本输入框 |
| Label | |
| Checkbox | 复选框 |
| Choice | 下拉选择框 |
3 布局管理器
AWT 使用布局管理器自动排列组件:
- FlowLayout:按添加顺序水平排列
- BorderLayout:分为东、南、西、北、中五个区域
- GridLayout:网格布局
- CardLayout:卡片式布局
setLayout(new BorderLayout());
add(new Button("北"), BorderLayout.NORTH);
add(new Button("南"), BorderLayout.SOUTH);
Swing(Java Foundation Classes)
Swing 是 AWT 的增强版,提供更丰富的组件和更灵活的定制能力,且具有跨平台外观。

1 基本结构
import javax.swing.;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class SwingExample extends JFrame {
JButton button;
public SwingExample() {
// 设置窗口属性
setTitle("Swing 示例");
setSize(300, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null); // 居中显示
// 创建按钮并添加事件监听
button = new JButton("点击我");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
button.setText("已点击");
}
});
// 使用面板和布局管理器
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout());
panel.add(button);
// 添加面板到窗口
add(panel);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
SwingExample frame = new SwingExample();
frame.setVisible(true);
});
}
}
2 常用组件
| 组件 | 说明 |
|---|---|
| JFrame | 顶级窗口 |
| JButton | 按钮 |
| JTextField | 单行文本输入框 |
| JLabel | |
| JCheckBox | 复选框 |
| JComboBox | 下拉选择框 |
| JTable | 表格 |
| JTree | 树形结构 |
3 MVC 设计模式
Swing 采用 MVC(模型-视图-控制器)模式:
- 模型(Model):数据表示(如 TableModel)
- 视图(View):组件展示(如 JTable)
- 控制器(Controller):事件处理(如监听器)
4 高级特性
- 图标和图片:使用
ImageIcon加载图片资源 - 自定义渲染:通过重写
paintComponent方法绘制自定义内容 - 对话框:
JOptionPane提供标准对话框(信息、确认、输入)
int result = JOptionPane.showConfirmDialog(null, "确认操作?", "提示", JOptionPane.YES_NO_OPTION);
JavaFX(JavaFX SDK)
JavaFX 是现代的 GUI 框架,支持 CSS 样式、FXML 布局和丰富的动画效果,适合复杂界面开发。
1 基本结构
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class JavaFXExample extends Application {
@Override
public void start(Stage primaryStage) {
// 创建按钮并设置事件
Button button = new Button("点击我");
button.setOnAction(e -> button.setText("已点击"));
// 使用布局容器
StackPane root = new StackPane();
root.getChildren().add(button);
// 创建场景和设置舞台
Scene scene = new Scene(root, 300, 200);
primaryStage.setTitle("JavaFX 示例");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
2 核心概念
- Stage:顶级窗口,对应应用程序主窗口
- Scene:包含所有内容的场景,可设置到 Stage
- Node:所有可视组件的基类(如 Button、Label)
- Layout:布局容器(如 VBox、HBox、GridPane)
- CSS 样式:通过
.css文件定义组件外观
3 FXML 布局
FXML 是用于描述 JavaFX 界面的 XML 格式,支持界面与逻辑分离。

example.fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.Button?>
<VBox alignment="CENTER" spacing="10">
<Button text="点击我" onAction="#handleClick"/>
</VBox>
ExampleController.java:
import javafx.fxml.FXML;
import javafx.scene.control.Button;
public class ExampleController {
@FXML private Button myButton;
@FXML
protected void handleClick() {
myButton.setText("已点击");
}
}
4 动画与效果
JavaFX 内置对动画的支持,如平移动画、缩放动画等。

TranslateTransition transition = new TranslateTransition(Duration.seconds(2), button); transition.setByX(100); transition.play();
技术对比与选择建议
| 特性 | AWT | Swing | JavaFX |
|---|---|---|---|
| 出现时间 | JDK 1.0 | JDK 1.2 | JDK 8(模块化于 JDK 11) |
| 组件风格 | 依赖系统原生组件 | 轻量级跨平台组件 | 现代化 UI,支持 CSS |
| 性能 | 较低 | 中等 | 较高(硬件加速) |
| 定制化 | 有限 | 较强 | 极强(CSS/FXML) |
| 适用场景 | 简单桌面应用 | 传统桌面应用 | 富客户端、企业级应用 |
选择建议:
- AWT:仅在需要与系统深度集成时使用(如特定平台功能)。
- Swing:适合中小型桌面应用,学习成本低。
- JavaFX:推荐新项目使用,尤其是需要复杂界面或跨平台一致性的应用。
常见问题与解决方案
1 界面卡顿或响应慢
- 原因:事件处理阻塞主线程(如 Swing/AWT)或大量 UI 更新。
- 解决:使用多线程处理耗时任务,Swing/AWT 中使用
SwingWorker,JavaFX 中使用Task。
2 组件大小不一致或模糊
- 原因:不同分辨率或缩放设置导致。
- 解决:使用布局管理器自适应布局,JavaFX 中启用 DPI 感知。
3 跨平台外观差异大(AWT/Swing)
- 解决:Swing 使用
UIManager统一外观,或迁移到 JavaFX。
FAQs
Q1:JavaFX 是否已包含在 JDK 中?如何引入?
A1:从 JDK 11 开始,JavaFX 不再随 JDK 捆绑,需单独下载 JavaFX SDK,可通过 Maven/Gradle 引入依赖,或手动配置模块路径,Maven 依赖:
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>20.0.1</version>
</dependency>
Q2:Swing 和 JavaFX 能否混合使用?
A2:可以,但需谨慎处理,SwingNode 允许在 JavaFX 中嵌入 Swing 组件,反之需通过 JFXPanel。
