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+ 图表说明