Java GUI 编程全攻略:Swing 与 JavaFX 入门实战

  • AWT(Abstract Window Toolkit):早期库,功能有限。
  • Swing:更现代,功能丰富,是 AWT 的扩展。
  • JavaFX:新一代 GUI 框架,支持样式、动画、图形等。

🎯 本文将重点介绍 Swing 和 JavaFX 的基本用法和项目实战。


二、Swing 基础:轻量级 GUI 编程

2.1 Swing 的核心组件

组件

说明

JFrame

主窗口

JPanel

面板容器

JLabel

标签

JButton

按钮

JTextField

文本输入框

JTextArea

多行文本输入

2.2 创建一个简单窗口

代码语言:javascript

AI代码解释

java复制编辑import javax.swing.*; public class HelloSwing { public static void main(String[] args) { JFrame frame = new JFrame("Swing 示例"); frame.setSize(400, 300); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JLabel label = new JLabel("你好,Swing!"); frame.add(label); frame.setVisible(true); } }

🖼️ 运行效果:

代码语言:javascript

AI代码解释

diff复制编辑+------------------------+ | 你好,Swing! | +------------------------+

2.3 添加按钮与事件响应

代码语言:javascript

AI代码解释

java复制编辑JButton button = new JButton("点击我"); button.addActionListener(e -> { JOptionPane.showMessageDialog(frame, "按钮被点击了!"); }); frame.add(button);

📌 事件监听机制是 Swing 的核心,基于观察者模式。


2.4 布局管理器概述

Swing 提供多种布局方式:

布局管理器

说明

FlowLayout

流式排列,默认布局

BorderLayout

上下左右中五个区域

GridLayout

表格状布局

BoxLayout

单行/单列组件排列

null

自由布局(需 setBounds)

示例:

代码语言:javascript

AI代码解释

java复制编辑frame.setLayout(new FlowLayout()); frame.add(new JButton("按钮1")); frame.add(new JButton("按钮2"));

三、Swing 项目实战:记事本应用

3.1 基本功能设计

功能需求:

  • 文本编辑区域
  • 打开 / 保存 文件
  • 清空 / 退出 功能
3.2 UI 结构示意图:

代码语言:javascript

AI代码解释

diff复制编辑+-----------------------------+ | 菜单栏:文件 编辑 | +-----------------------------+ | | | JTextArea | | | +-----------------------------+
3.3 实现代码:

代码语言:javascript

AI代码解释

java复制编辑public class SimpleNotepad { public static void main(String[] args) { JFrame frame = new JFrame("记事本"); JTextArea textArea = new JTextArea(); frame.add(new JScrollPane(textArea)); JMenuBar menuBar = new JMenuBar(); JMenu fileMenu = new JMenu("文件"); JMenuItem openItem = new JMenuItem("打开"); JMenuItem saveItem = new JMenuItem("保存"); JMenuItem exitItem = new JMenuItem("退出"); openItem.addActionListener(e -> { JFileChooser chooser = new JFileChooser(); if (chooser.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION) { try { File file = chooser.getSelectedFile(); textArea.setText(Files.readString(file.toPath())); } catch (IOException ex) { ex.printStackTrace(); } } }); saveItem.addActionListener(e -> { JFileChooser chooser = new JFileChooser(); if (chooser.showSaveDialog(frame) == JFileChooser.APPROVE_OPTION) { try { File file = chooser.getSelectedFile(); Files.writeString(file.toPath(), textArea.getText()); } catch (IOException ex) { ex.printStackTrace(); } } }); exitItem.addActionListener(e -> System.exit(0)); fileMenu.add(openItem); fileMenu.add(saveItem); fileMenu.add(exitItem); menuBar.add(fileMenu); frame.setJMenuBar(menuBar); frame.setSize(500, 400); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }

✅ 实现了基本的记事本功能,适合初学 Swing 项目开发。


四、JavaFX:现代 Java GUI 新选择

4.1 JavaFX 与 Swing 的对比

对比点

Swing

JavaFX

样式支持

较弱

支持 CSS

UI 构建方式

代码手写

可使用 FXML 可视化

动画支持

基本

强大

性能表现

中等

更好


Read more

Flutter for OpenHarmony:result_dart 告别 try-catch,让错误处理像 Rust 一样优雅(Result 类型模式) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:result_dart 告别 try-catch,让错误处理像 Rust 一样优雅(Result 类型模式) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在 Dart 中,异常(Exception)是隐式的,你看不到函数签名上有 throws 标记。这不仅导致调用者经常忘记捕获异常,还使代码充斥着难以追踪的 try...catch 块。 受 Rust 语言的启发,result_dart 引入了 Result<Success, Failure> 类型。它将成功值和错误值都包装在同一个对象中,强制你在编译期就处理可能发生的错误,从而写出极度健壮的代码。 在传统的面向对象编程(OOP)中,异常(Exception) 是处理错误的默认机制。我们习惯了: try{final user =awaitgetUser();// ...}catch(e){// 处理错误} 但这带来了一个巨大的问题:

By Ne0inhk
Flask工厂模式与蓝图设计:构建可扩展大型应用的架构之道

Flask工厂模式与蓝图设计:构建可扩展大型应用的架构之道

目录 📖 摘要 🏗️ 第一章:为什么需要工厂模式? 1.1 从单体应用到模块化架构 1.2 工厂模式的诞生 1.3 性能提升数据 🔧 第二章:Flask应用工厂深度解析 2.1 基础工厂实现 2.2 配置管理 2.3 扩展初始化顺序 🧩 第三章:蓝图模块化架构 3.1 蓝图基础 3.2 企业级蓝图结构 3.3 蓝图间通信 🚀 第四章:完整电商平台实战 4.1 项目结构 4.2 应用工厂完整实现 4.3 数据模型设计 4.4 测试策略 🚀 第五章:

By Ne0inhk
KWDB 硬核实战:30ms 写入千条轨迹,用 SQL 打造物流车队“天眼”系统

KWDB 硬核实战:30ms 写入千条轨迹,用 SQL 打造物流车队“天眼”系统

前言: 随着 5G 和物联网技术的普及,车联网 (Internet of Vehicles, IoV) 正成为数据爆发的新战场。与传统的静态传感器不同,车辆是移动的计算节点,它们每时每刻都在产生海量的时间序列数据:从 GPS 经纬度到发动机转速,从剩余油量到刹车踏板状态。 对于一家拥有数百辆货车的物流公司而言,这些数据就是金矿。通过实时监控,可以有效降低油耗、杜绝违规驾驶、优化配送路线。然而,传统的关系型数据库在面对车辆高频上报(例如每秒 10 次)的轨迹数据时,往往面临写入瓶颈;而单纯的时序数据库又难以处理复杂的车辆档案关联查询。 KWDB (KaiwuDB) 的“多模”特性恰好解决了这一痛点。今天,我们将实战构建一个物流车队实时监控平台,挑战如何在一个数据库内同时搞定“车辆档案管理”与“海量轨迹分析”。 场景设定:我们要为一个拥有 200 辆货车的物流车队构建监控系统。 核心挑战:高频写入:车辆每 10

By Ne0inhk
MySQL必备基础

MySQL必备基础

MySQL必备基础 * DML-插入 * DML-更新和删除 * DQL-基础查询 * DQL-条件查询 * DQL-聚合函数 * DQL-分组查询 * DQL-排序查询 * DQL-分页查询 * DQL-案例联系 * DQL-执行顺序 * DQL-小结 * DCL-用户管理 * DCL-权限控制 * DCL-小结 * 函数-字符串函数 * 函数-数据函数 * 函数-日期函数 * 函数-流程函数 * 约束-概述 * 约束-外键约束 * 约束-小结 * 多表关系介绍 * 多表查询概述 * 内连接 * 外连接 * 自连接 * 联合查询 union * 子查询 * 标量子查询 * 列子查询 * 行子查询 * 表子查询 * 事务简介 * 事务演示 * ACID四大特性 * 并发事务问题 * 隔离级别

By Ne0inhk