Java初学者用Swing写记事本需规避三类高频崩溃点:一是必须用SwingUtilities.invokeLater启动GUI线程,否则抛IllegalStateException;二是JTextArea需setLineWrap(true)并嵌入JScrollPane;三是文件读写须显式指定UTF-8编码并考虑BOM兼容性。

Java初学者用 Swing 写记事本,核心不是“做完整功能”,而是避开 SwingUtilities.invokeLater 忘写、JTextArea 未设换行、文件编码乱码这三类高频崩溃点。
为什么新建窗口总卡死或报 java.lang.IllegalStateException: Applets not supported
这不是浏览器问题——这是在 IDE(如 IntelliJ)里直接运行 Applet 类或误选了错误的主类。Swing 窗口必须从 JFrame 派生,并且启动逻辑必须包裹在 SwingUtilities.invokeLater 中,否则 GUI 线程未初始化就操作组件,JVM 会拒绝执行。
- 确保入口类是普通
public class Notepad,不含extends Applet - 主方法必须长这样:
public static void main(String[] args) { SwingUtilities.invokeLater(() -> { new Notepad().setVisible(true); }); } - 别在
main里直接 newJFrame并调用setVisible(true),这是初学者最常跳的坑
JTextArea 输入文字不换行、滚动条不出现?
默认 JTextArea 是单行模式,且 JScrollPane 不会自动监听内容变化。你得手动关掉行截断、启用换行、再把文本区塞进带滚动条的容器。
- 调用
textArea.setLineWrap(true)和textArea.setWrapStyleWord(true)(后者让断行按词切,不劈开单词) - 必须用
new JScrollPane(textArea)构造滚动容器,不能只加textArea到JFrame - 别漏掉
frame.add(scrollPane, BorderLayout.CENTER)—— 如果用BorderLayout却往NORTH加,内容区会塌缩成一条线
保存中文到文件后全是 ??? 或打开乱码?
Java FileWriter 默认用平台编码(Windows 是 GBK,Mac/Linux 是 UTF-8),而记事本(Notepad.exe)默认只认 UTF-8 带 BOM 或 ANSI。两者不匹配,必然乱码。
立即学习“Java免费学习笔记(深入)”;
- 统一用
OutputStreamWriter+FileOutputStream,显式指定"UTF-8"编码 - 写入前加 BOM 可提升 Windows 兼容性:
out.write("\uFEFF"); // 写入 UTF-8 BOM - 读取时也必须用
InputStreamReader指定"UTF-8",别用FileReader(它不接受编码参数)
菜单栏点击没反应?ActionListener 绑错了对象
常见写法是给 JMenuItem 添加监听器,但忘了它本身不触发事件——除非你调用了 item.addActionListener(...)。更隐蔽的问题是:监听器里调用 System.exit(0) 会杀掉整个 JVM,而不是仅关闭窗口。
- 关闭窗口请用
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE),再在菜单响应中调用frame.dispose() - 保存逻辑里别用
FileWriter而不用try-with-resources,文件句柄泄漏会导致第二次保存失败 - 如果用
JFileChooser,记得调chooser.setFileFilter过滤.txt,否则用户可能选中图片导致IOException
真正卡住初学者的,从来不是“怎么实现另存为”,而是 FileOutputStream 打开后没关、SwingUtilities.invokeLater 漏写、以及 Windows 下 UTF-8 不带 BOM 导致的“明明写了中文却显示问号”——这些点不提前踩一遍,项目就停在第一版无法迭代。










