我们将使用 Java 最经典和基础的 GUI 工具包:Swing,通过这个项目,你可以学到 Swing 的核心组件,如 JFrame, JTextArea, JMenuBar, JMenu, JMenuItem 以及如何处理事件。

第一步:开发环境配置
在开始编码之前,请确保你已经配置好了 Java 开发环境。
-
安装 JDK (Java Development Kit):
- 访问 Oracle 官网或 OpenJDK 官网下载并安装适合你操作系统的 JDK。
- 验证安装: 打开终端或命令提示符,输入
java -version和javac -version,如果都显示版本号,说明安装成功。
-
选择一个代码编辑器或 IDE (集成开发环境):
- Notepad++: 轻量级,语法高亮,适合初学者。
- Visual Studio Code: 功能强大,插件丰富(如 "Extension Pack for Java"),非常流行。
- IntelliJ IDEA: 功能最强大的 Java IDE,社区版是免费的。
- Eclipse: 另一个老牌的免费 Java IDE。
对于初学者,VS Code 或 IntelliJ IDEA 社区版是很好的选择。

第二步:创建 Java 项目并编写代码
我们将创建一个简单的记事本,它包含:
- 一个主窗口。
- 一个可以输入和编辑文本的区域。
- 一个菜单栏,包含 "文件" 菜单,其中有 "新建"、"打开"、"保存" 和 "退出" 功能。
创建项目文件
在你的工作目录下,创建一个新的文件夹,NotepadJava,在该文件夹中,创建一个名为 Notepad.java 的文件。
编写 Notepad.java 代码
下面是完整的代码,包含详细的注释,你可以直接复制并粘贴到 Notepad.java 文件中。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class Notepad extends JFrame {
// 文本区域组件
private JTextArea textArea;
// 文件对象,用于保存和打开
private File currentFile;
public Notepad() {
// 1. 设置窗口基本属性
setTitle("Java 记事本");
setSize(800, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 关闭窗口时退出程序
setLocationRelativeTo(null); // 窗口居中显示
// 2. 创建菜单栏
JMenuBar menuBar = new JMenuBar();
// 3. 创建 "文件" 菜单
JMenu fileMenu = new JMenu("文件");
// 4. 创建 "文件" 菜单下的菜单项
JMenuItem newItem = new JMenuItem("新建");
JMenuItem openItem = new JMenuItem("打开");
JMenuItem saveItem = new JMenuItem("保存");
JMenuItem exitItem = new JMenuItem("退出");
// 5. 为菜单项添加事件监听器
newItem.addActionListener(e -> newFile());
openItem.addActionListener(e -> openFile());
saveItem.addActionListener(e -> saveFile());
exitItem.addActionListener(e -> System.exit(0)); // 直接退出程序
// 6. 将菜单项添加到 "文件" 菜单
fileMenu.add(newItem);
fileMenu.add(openItem);
fileMenu.add(saveItem);
fileMenu.addSeparator(); // 添加一个分隔线
fileMenu.add(exitItem);
// 7. 将 "文件" 菜单添加到菜单栏
menuBar.add(fileMenu);
// 8. 创建文本区域
textArea = new JTextArea();
// 添加滚动条,当文本内容超出窗口大小时可以滚动
JScrollPane scrollPane = new JScrollPane(textArea);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
// 9. 将菜单栏和文本区域添加到窗口中
setJMenuBar(menuBar);
add(scrollPane, BorderLayout.CENTER); // 文本区域占据窗口中央
}
// --- 文件操作方法 ---
// 新建文件:清空文本区域
private void newFile() {
textArea.setText("");
currentFile = null;
setTitle("Java 记事本 - 新文件");
}
// 打开文件:读取文件内容并显示在文本区域
private void openFile() {
JFileChooser fileChooser = new JFileChooser();
int returnValue = fileChooser.showOpenDialog(this);
if (returnValue == JFileChooser.APPROVE_OPTION) {
currentFile = fileChooser.getSelectedFile();
try (BufferedReader reader = new BufferedReader(new FileReader(currentFile))) {
textArea.read(reader, null); // 使用 JTextArea 的 read 方法读取文件
setTitle("Java 记事本 - " + currentFile.getName());
} catch (IOException ex) {
JOptionPane.showMessageDialog(this, "无法打开文件: " + ex.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
}
}
}
// 保存文件:将文本区域的内容写入文件
private void saveFile() {
if (currentFile == null) {
// 如果是新建的文件,则先弹出保存对话框
JFileChooser fileChooser = new JFileChooser();
int returnValue = fileChooser.showSaveDialog(this);
if (returnValue == JFileChooser.APPROVE_OPTION) {
currentFile = fileChooser.getSelectedFile();
} else {
return; // 用户取消了保存
}
}
try (BufferedWriter writer = new BufferedWriter(new FileWriter(currentFile))) {
textArea.write(writer); // 使用 JTextArea 的 write 方法写入文件
setTitle("Java 记事本 - " + currentFile.getName());
} catch (IOException ex) {
JOptionPane.showMessageDialog(this, "无法保存文件: " + ex.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
}
}
// --- 主方法 ---
public static void main(String[] args) {
// 使用 SwingUtilities.invokeLater 来确保 GUI 创建在事件分发线程上
SwingUtilities.invokeLater(() -> {
Notepad notepad = new Notepad();
notepad.setVisible(true); // 显示窗口
});
}
}
第三步:编译和运行
使用命令行(推荐理解原理)
-
打开终端/命令提示符:
(图片来源网络,侵删)- Windows: 打开
cmd或PowerShell。 - macOS/Linux: 打开
Terminal。
- Windows: 打开
-
进入项目目录: 使用
cd命令切换到你创建Notepad.java文件的目录。cd /path/to/your/NotepadJava
-
编译代码: 使用
javac命令编译.java文件,这会生成一个.class文件。javac Notepad.java
如果没有错误,你会看到生成了
Notepad.class文件。 -
运行程序: 使用
java命令运行编译后的.class文件,注意这里不需要加.class后缀。java Notepad
一个简单的记事本窗口应该就出现了!
使用 IDE (以 IntelliJ IDEA 为例)
-
创建新项目:
- 打开 IntelliJ IDEA。
- 选择 "File" -> "New" -> "Project"。
- 选择 "Java",确保 JDK 配置正确,点击 "Create"。
-
添加代码:
- 在
src目录下,右键点击 "New" -> "Java Class"。 - 将类名命名为
Notepad,然后将上面提供的代码粘贴进去。
- 在
-
运行程序:
- 在代码编辑器中,找到
main方法。 - 在
main方法的左侧或行号旁边,你会看到一个绿色的 "运行" 三角箭头图标。 - 点击它,或者直接按
Shift + F10。 - IDEA 会自动编译并运行你的程序,记事本窗口会弹出。
- 在代码编辑器中,找到
代码结构解析
JFrame: 所有 Swing 窗口的顶级容器,我们的Notepad类继承自JFrame,意味着它本身就是一个窗口。JMenuBar,JMenu,JMenuItem: 构建菜单栏的组件。JMenuBar是菜单栏,JMenu是菜单(如“文件”),JMenuItem是菜单项(如“打开”)。JTextArea: 用于显示和编辑多行文本的核心组件。JScrollPane: 一个带滚动条的容器,我们将JTextArea放入JScrollPane中,这样当文本很长时,用户就可以通过滚动条查看所有内容。JFileChooser: 一个标准的文件选择对话框,用于让用户选择要打开或保存的文件。BufferedReader/BufferedWriter: 用于高效读写文本文件的流。try-with-resources语句 (try (...)) 可以确保流在使用后被自动关闭,防止资源泄漏。JOptionPane: 用于显示简单的对话框,如错误提示或确认信息。SwingUtilities.invokeLater(...): 这是编写 Swing 应用程序的标准做法,它确保所有的 GUI 创建和更新操作都在“事件分发线程”(Event Dispatch Thread, EDT)上执行,避免了多线程操作 GUI 可能导致的线程安全问题。ActionListener: 用于响应用户的操作(如点击菜单项),我们使用 Lambda 表达式e -> ...来简化代码,使其更简洁。
扩展功能
你可以基于这个基础,继续添加更多功能,
- 编辑菜单: 添加“撤销”、“剪切”、“复制”、“粘贴”功能。
- 格式菜单: 添加“字体”、“颜色”设置。
- 查找和替换功能。
- 状态栏: 在窗口底部显示当前行号、列号等信息。
- 保存为: 实现一个独立的“另存为”功能。
这个项目是学习 Java GUI 编程的绝佳起点,祝你编码愉快!
