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
。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/63639.html