Java初学者项目实战:构建个人记事本应用

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 里直接 new JFrame 并调用 setVisible(true),这是初学者最常跳的坑

JTextArea 输入文字不换行、滚动条不出现?

默认 JTextArea 是单行模式,且 JScrollPane 不会自动监听内容变化。你得手动关掉行截断、启用换行、再把文本区塞进带滚动条的容器。

  • 调用 textArea.setLineWrap(true)textArea.setWrapStyleWord(true)(后者让断行按词切,不劈开单词)
  • 必须用 new JScrollPane(textArea) 构造滚动容器,不能只加 textAreaJFrame
  • 别漏掉 frame.add(scrollPane, BorderLayout.CENTER) —— 如果用 BorderLayout 却往 NORTH 加,内容区会塌缩成一条线

保存中文到文件后全是 ??? 或打开乱码?

Java FileWriter 默认用平台编码(Windows 是 GBK,Mac/Linux 是 UTF-8),而记事本(Notepad.exe)默认只认 UTF-8 带 BOM 或 ANSI。两者不匹配,必然乱码。

  • 统一用 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 导致的“明明写了中文却显示问号”——这些点不提前踩一遍,项目就停在第一版无法迭代。