核心是组合JTextArea与JFileChooser:JTextArea需设setLineWrap(true)、setWrapStyleWord(true)并嵌入JScrollPane;JFileChooser须调用setCurrentDirectory(new File("."))和setFileFilter,读写用Files工具类并显式指定编码。

用 JTextArea + JFileChooser 搭出可用的编辑界面
核心不是从零造轮子,而是把 Swing 提供的组件串起来。重点是让 JTextArea 支持换行、滚动和实时修改状态,再用 JFileChooser 控制文件路径选择——它默认不记住上次目录,需要手动调用 setCurrentDirectory(new File(".")) 才能从当前项目根开始浏览。
常见错误:直接 new JTextArea(20, 40) 后没包进 JScrollPane,导致内容超长时无法拖动;或者把 JFileChooser 实例反复 new,造成对话框历史丢失。
- 设置
JTextArea的setLineWrap(true)和setWrapStyleWord(true)实现软换行 -
JFileChooser调用前先setFileFilter限定显示.txt文件,避免用户误选二进制文件 - 读取文件后调用
textArea.setText(content),而不是append(),否则会叠加旧内容
用 Files.readAllLines() 和 Files.write() 替代老式 FileReader
Java 7+ 的 Files 工具类更简洁,自动处理编码和资源关闭。但要注意:默认使用 UTF-8,如果打开 GBK 编码的旧文本(比如 Windows 记事本保存的),会乱码;必须显式传入 StandardCharsets.UTF_8 或 Charset.forName("GBK")。
性能上,readAllLines() 适合小文件(Files.lines() 流式处理,否则容易 OOM。
立即学习“Java免费学习笔记(深入)”;
- 读取:
List
lines = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8); - 写入:
Files.write(file.toPath(), content.getBytes(StandardCharsets.UTF_8));
- 追加写(如日志)用
Files.write(..., StandardOpenOption.APPEND)
监听 Document 变更判断是否需保存
不能靠“用户点过保存按钮”来判断是否脏数据,得监听文本变化。JTextArea 的底层是 Document 对象,注册 DocumentListener 是唯一可靠方式。但注意:初始化时 setText() 也会触发 insertUpdate,导致刚打开文件就提示“内容已修改”。
- 加载完文件后立即调用
document.setModified(false)(需自定义PlainDocument子类或用标志位绕过首次触发) - 监听器里别做耗时操作,比如实时校验语法——这会让打字卡顿
- 关闭窗口前检查
isModified状态,弹出确认对话框用JOptionPane.showConfirmDialog()
保存时覆盖原文件还是另存为?关键在 file 引用是否为空
用户首次编辑未保存的文档,点击“保存”应触发“另存为”逻辑;已有文件路径的才直接覆盖。这个分支不能只看菜单项文字,而要看当前绑定的 File 对象是否为 null 或 isDirectory()。
容易被忽略的是权限问题:如果原文件是只读(如 Linux 下 chmod -w),Files.write() 会抛 AccessDeniedException,需捕获并提示用户检查文件属性。
- 判断逻辑:
if (currentFile == null || !currentFile.exists()) { showSaveDialog(); } - 覆盖前可先
Files.deleteIfExists(currentFile.toPath())避免部分写入失败残留 - Windows 下正在被其他程序打开的文件,
write()会直接失败,无静默降级方案










