SWT 教程 - 目录

SWT 教程 - 目录


作者:步子哥 (steper@foxmail.com)


序言:为什么选择 SWT?

想象一下,你要用 Java 写一个桌面应用。
就像要在异国他乡建造一座家园,
你面对两种选择:

一种是用 Java 自己画门窗、刻柱子,
完全不用当地的材料(这是 Swing)
但画出来的东西总觉得"不够当地味"

另一种是直接用当地现成的砖瓦木料,
只是用你的指挥棒(Java)让它们听话(这就是 SWT)

第一部分:入门篇 - 认识 SWT 的本质

第1章:SWT 是什么?

  • 1.1 三个比喻看懂 SWT

- 比喻一:翻译官与当地工匠 - 比喻二:桥梁的两端 - 比喻三:操作系统 API 的披萨外卖

  • 1.2 SWT 的前世今生

- 从 AWT 到 Swing 再到 SWT - Eclipse 的诞生故事

  • 1.3 SWT vs Swing vs JavaFX

- 一张表看清三者的差异 - 何时选择 SWT?

  • 1.4 SWT 的设计哲学

- "原生优先":让应用像本地应用 - "薄薄一层":不重复造轮子 - "掌控与放手":在 Java 与系统之间平衡

第2章:环境搭建

  • 2.1 最简单的 Hello SWT

- Maven 依赖配置 - Gradle 依赖配置 - 手动添加 jar 包

  • 2.2 第一个 SWT 程序

- 创建 Display - 创建 Shell(窗口) - 打开主循环 - 资源释放的重要性

  • 2.3 常见问题解决

- 找不到原生库(.dll, .so, .jnilib) - 平台相关的坑 - 调试技巧


第二部分:基础篇 - SWT 的五大组件

第3章:Display 与 Shell - 舞台与幕布

  • 3.1 Display:操作系统的对话者

- 为什么必须先创建 Display? - 多 Display 的陷阱 - Display 的生命周期管理

  • 3.2 Shell:窗口的容器

- 主窗口 vs 弹出窗口 - 模态 vs 非模态 - Shell 的样式(Styles)

  • 3.3 事件循环:让程序活起来

- readAndDispatch() 的秘密 - sleep() 的作用 - 为什么要这样写循环?

第4章:基础控件 - 积木的初体验

  • 4.1 标签(Label)

- 文本与图像的显示 - 分隔线的妙用

  • 4.2 按钮(Button)

- 普通按钮、复选框、单选按钮 - 按钮的样式组合 - 图标按钮的制作

  • 4.3 文本输入(Text)

- 单行与多行 - 密码框、只读框 - 文本选择与光标控制

  • 4.4 列表(List)

- 添加、删除、选择 - 多选与单选

  • 4.5 组合框(Combo)

- 下拉列表的本质 - 可编辑与不可编辑

第5章:布局管理器 - 不用手算像素的艺术

  • 5.1 为什么要用布局?

- 手写坐标的痛苦 - 不同系统的字体差异 - 窗口缩放的考验

  • 5.2 FillLayout:填满一切

- 最简单的布局 - 水平与垂直排列 - 间距控制

  • 5.3 RowLayout:排队走

- 左右对齐、居中 - 自动换行 - 间距与边距

  • 5.4 GridLayout:网格的魔法(最常用)

- 行列的概念 - 跨列(grabExcessHorizontalSpace) - 跨行(verticalSpan) - 对齐方式 - 间距与边距

  • 5.5 FormLayout:自由定位

- 附件(Attachment)的概念 - 相对定位的威力 - 百分比定位

第6章:事件处理 - 让控件响应你的心意

  • 6.1 事件系统的原理

- 监听器(Listener)的本质 - 事件对象(Event)携带的信息

  • 6.2 常用事件监听器

- SelectionListener:点击与选择 - ModifyListener:内容改变 - FocusListener:焦点获得与失去 - KeyListener:键盘按键 - MouseListener:鼠标点击 - MouseMoveListener:鼠标移动

  • 6.3 匿名类 vs Lambda 表达式

- 从冗长到简洁的演进 - Lambda 的局限(需要 Java 8+)

  • 6.4 事件的传播与取消

- doit 字段的秘密 - 事件链与优先级


第三部分:进阶篇 - SWT 的深层能力

第7章:高级控件 - 丰富的交互体验

  • 7.1 表格(Table)

- 列与行的概念 - 表头的添加与排序 - 单选、多选、复选框列 - 虚拟表格(Virtual Table):处理大数据

  • 7.2 树(Tree)

- 节点与子节点 - 展开/折叠的控制 - 树项的图标 - 复杂的树形数据

  • 7.3 滚动条(Scrollable)

- 为什么有些控件自带滚动条? - 滚动条的显示策略 - 滚动事件的监听

  • 7.4 菜单(Menu)

- 顶部菜单 vs 右键菜单 - 级联菜单(子菜单) - 分隔线 - 菜单项的快捷键

  • 7.5 工具栏(ToolBar)

- 工具按钮(ToolItem) - 下拉式工具按钮 - 图标与提示文本

  • 7.6 标签页(TabFolder)

- 多标签页管理 - 标签页的关闭按钮

  • 7.7 进度条(ProgressBar)

- 普通进度条 vs 不确定进度条 - 进度的动画效果

  • 7.8 滑块(Slider)与刻度(Scale)

- 数值选择的可视化 - 事件监听与数据绑定

第8章:对话框与消息框 - 用户友好的沟通

  • 8.1 消息框(MessageBox)

- 信息、警告、错误、确认 - 自定义按钮文本 - 获取用户选择

  • 8.2 文件对话框(FileDialog)

- 打开文件 vs 保存文件 - 过滤文件类型 - 多文件选择

  • 8.3 目录对话框(DirectoryDialog)

- 选择目录

  • 8.4 颜色对话框(ColorDialog)

- 选择颜色 - 自定义颜色

  • 8.5 字体对话框(FontDialog)

- 选择字体、大小、样式

  • 8.6 自定义对话框

- 继承 Dialog 类 - 模态对话框的创建 - 返回值的传递

第9章:绘图与动画 - Canvas 的艺术

  • 9.1 GC(Graphics Context):画笔与画布

- 绘制线条、矩形、椭圆 - 颜色的设置 - 字体的设置 - 透明与混合

  • 9.2 自定义控件入门

- 继承 Canvas 类 - 重写 paintControl 方法 - 响应鼠标事件

  • 9.3 动画的基础

- 定时器的使用 - 重绘机制(redraw() vs update()) - 双缓冲技术

  • 9.4 实战案例:画一个时钟

- 绘制表盘、刻度、指针 - 定时更新 - 平滑动画

第10章:线程与 SWT - 不要阻塞 UI

  • 10.1 SWT 的线程规则

- 为什么只能在主线程操作 UI? - 跨线程访问 UI 的后果

  • 10.2 后台任务处理

- 创建工作线程 - 避免 UI 卡顿

  • 10.3 从后台线程更新 UI

- Display.asyncExec() - Display.syncExec() - 两者的区别与选择

  • 10.4 进度对话框(ProgressMonitorDialog)

- 后台任务的进度反馈 - 取消操作的处理

  • 10.5 实战案例:文件复制进度条

第11章:资源管理 - 内存泄漏的隐形杀手

  • 11.1 SWT 资源的特殊性

- 操作系统资源的本质 - GC 不会自动回收 SWT 资源

  • 11.2 需要释放的资源类型

- Color、Font、Image、Cursor - GC、Path、Pattern - 其他设备相关资源

  • 11.3 资源释放的最佳实践

- dispose() 的调用时机 - Widget.addDisposeListener() - 资源池(ResourceRegistry)模式

  • 11.4 常见泄漏场景

- Color、Font 的反复创建 - Image 未释放 - GC 未 dispose

  • 11.5 调试技巧

- 如何检测资源泄漏 - SWT 资源跟踪工具

第12章:拖放与剪贴板 - 跨应用的交互

  • 12.1 剪贴板(Clipboard)

- 文本的复制与粘贴 - 图片的复制与粘贴 - 自定义数据类型

  • 12.2 拖放(DnD)基础

- DragSource 与 DropTarget - 拖放的类型:文本、文件、自定义数据

  • 12.3 拖放的事件监听

- DragStartEvent - DragEnterEvent、DragOverEvent - DropEvent

  • 12.4 实战案例:拖放文件到应用

第四部分:高级篇 - 系统级能力

第13章:SWT 与操作系统的深度集成

  • 13.1 调用系统浏览器

- Program.launch()

  • 13.2 系统托盘(Tray)

- 托盘图标 - 悬停提示 - 弹出菜单

  • 13.3 获取系统信息

- 屏幕分辨率 - 可用工作区 - 系统字体

  • 13.4 平台特定的注意事项

- Windows 的特殊处理 - Mac 的菜单栏规则 - Linux 的主题适配

第14章:国际化(i18n)

  • 14.1 为什么需要国际化?

- 不同语言的用户 - 日期、数字格式的差异

  • 14.2 资源束(ResourceBundle)的使用

- 创建属性文件 - 加载资源 - 占位符替换

  • 14.3 SWT 的国际化支持

- 控件文本的翻译 - 菜单的翻译 - 错误消息的翻译

  • 14.4 RTL(从右到左)语言支持

- 阿拉伯语、希伯来语的处理

第15章:主题与样式(可选)

  • 15.1 SWT 主题的概念

- Dark Mode 的支持 - 自定义颜色方案

  • 15.2 CSS 在 SWT 中的应用(如果可用)

- 使用 CSS 定义样式 - 动态切换主题

  • 15.3 图标主题

- SVG 图标的支持(如果可用) - 多尺寸适配

第16章:SWT 应用的打包与部署

  • 16.1 使用 Eclipse Export Wizard

- 导出为可执行 JAR - 包含依赖项

  • 16.2 使用 Maven Shade 插件

- 构建 fat jar - 平台特定的依赖处理

  • 16.3 使用 jpackage(Java 14+)

- 打包为原生安装程序 - Windows:.exe、.msi - Mac:.app、.dmg - Linux:.deb、.rpm

  • 16.4 分发原生库

- 提取原生库到临时目录 - 设置 java.library.path

  • 16.5 签名与公证(Mac)

- 解决 Mac 的安全警告

第17章:SWT 性能优化

  • 17.1 避免不必要的重绘

- redraw() 的滥用 - 批量更新

  • 17.2 虚拟控件的使用

- VirtualTable、VirtualTree - 延迟加载

  • 17.3 减少布局计算

- 缓存布局数据 - 避免频繁修改布局

  • 17.4 资源复用

- 资源池模式 - 缓存常用资源

  • 17.5 性能分析工具

- VisualVM - SWT 专门的性能分析


第五部分:实战篇 - 从零构建完整应用

第18章:项目实战 - 笔记本应用

  • 18.1 需求分析

- 功能列表 - 技术选型

  • 18.2 界面设计

- 主窗口布局 - 菜单栏设计 - 工具栏设计 - 侧边栏与编辑器

  • 18.3 数据模型

- 笔记的数据结构 - 文件的保存与加载

  • 18.4 功能实现

- 新建、打开、保存、另存为 - 文本编辑 - 搜索与替换 - 最近文件列表 - 自动保存

  • 18.5 完整代码

- 主类实现 - 辅助类 - 资源管理

  • 18.6 测试与优化

- 功能测试 - 性能测试 - 跨平台测试

第19章:项目实战 - 图片浏览器

  • 19.1 需求分析

- 功能列表 - 技术挑战

  • 19.2 界面设计

- 图片列表与预览区域 - 缩放、旋转控制 - 幻灯片模式

  • 19.3 图片处理

- 加载图片(支持多种格式) - 缩放与裁剪 - 缓存机制

  • 19.4 高级功能

- 全屏模式 - 拖拽打开图片 - 删除图片 - 图片信息显示

  • 19.5 完整代码
  • 19.6 打包与分发

第六部分:附录与参考资料

附录 A:常用 API 快速参考

  • A.1 Display 常用方法
  • A.2 Shell 常用方法
  • A.3 控件样式常量
  • A.4 布局参数参考
  • A.5 事件类型参考

附录 B:常见问题 FAQ

  • B.1 SWT 与 Swing 混用的问题
  • B.2 高分屏(HiDPI)适配
  • B.3 Dark Mode 支持
  • B.4 多显示器支持
  • B.5 SWT 版本兼容性

附录 C:调试与错误排查

  • C.1 常见异常与解决
  • C.2 日志输出
  • C.3 调试技巧

附录 D:扩展阅读

  • D.1 官方文档链接
  • D.2 推荐书籍
  • D.3 社区资源
  • D.4 相关项目

后记:SWT 的未来展望

技术的浪潮从未停止,
AWT、Swing、JavaFX 轮番登场,
而 SWT 依然坚守着"原生"的信念。

也许有一天会有新的选择,
但理解了 SWT,你就理解了
如何优雅地架起 Java 与系统之间的桥梁。

本教程特色:

  • ✅ 每个复杂概念都有费曼级比喻
  • ✅ 表层有故事,中层有技巧,深层有哲理
  • ✅ 草蛇灰线:前面的知识在后面有呼应
  • ✅ 系统完整:从入门到实战的全覆盖
  • ✅ 极其详实:200+ 代码示例,500+ 图表说明
← 返回目录