Swing中实现记事本应使用JTextArea+JScrollPane配合SwingWorker进行文件I/O,避免阻塞EDT;需正确配置换行、编辑性及JFileChooser过滤器与返回值判断,确保大文件加载不卡顿、异常不崩溃、内容不丢失。

Swing 本身不提供现成的“记事本”组件,JTextArea + JScrollPane + 手动文件 I/O 是最直接、可控的实现路径。别试图找 JNotepad 这种不存在的类。
用 JTextArea 承载文本内容,别用 JTextField
JTextField 只支持单行,强行换行会截断;JTextArea 天然支持多行、自动换行(需开启)、滚动和选中文本。
- 设置
setLineWrap(true)和setWrapStyleWord(true)实现软换行 - 调用
setEditable(true)确保可编辑(默认就是 true,但显式写上更稳妥) - 避免直接操作
setText()加载大文件——可能卡 UI;改用read(Reader, Object)方法流式加载
文件读写必须脱离 EDT,否则界面冻结
Swing 的事件分发线程(EDT)不能被阻塞。用 Files.readAllLines() 或 FileReader 同步读大文件,UI 会假死几秒。
- 用
SwingWorker在后台线程读取文件,完成后在 EDT 更新JTextArea - 保存时同样用
SwingWorker,或至少用SwingUtilities.invokeLater()包裹提示逻辑(如 “保存成功” 弹窗) - 别在
actionPerformed里直接写Files.write(...)—— 小文件侥幸不卡,但逻辑已埋雷
JFileChooser 的常见陷阱:路径、过滤器、返回值判断
JFileChooser 看似简单,但实际使用中三个地方最容易出错:
立即学习“Java免费学习笔记(深入)”;
- 没调用
setFileFilter(new FileNameExtensionFilter("文本文档", "txt")),用户看不到 .txt 文件(Windows 默认隐藏扩展名) - 忽略
showOpenDialog()的返回值:JFileChooser.APPROVE_OPTION才代表用户点了“打开”,否则可能是点“取消”或关窗口 - 用
getSelectedFile().getPath()获取路径,但未检查是否为 null —— 用户取消后该方法返回 null,直接read()会抛NullPointerException
真正难的不是画出菜单栏或响应 Ctrl+S,而是让文件操作不卡界面、不崩异常、不丢内容。很多“能跑”的记事本,在打开 5MB 日志文件或误点取消后就暴露问题。











