Java 图形界面的核心技术是 Swing 和 AWT,对于初学者和大多数应用来说,Swing 是更现代、功能更强大的选择,我们将主要围绕 Swing 进行讲解。

整个过程可以分为以下几个步骤:
- 创建 Java 项目
- 创建主窗口类
- 向窗口中添加组件
- 处理事件(例如按钮点击)
- 运行和测试
第 1 步:创建 Java 项目
- 打开 Eclipse。
- 点击菜单栏的
File->New->Java Project。 - 输入项目名称,
MyFirstGUI。 - 确保
Use an execution environment JRE已经选中(通常默认会选中一个)。 - 点击
Finish。
第 2 步:创建主窗口类
一个 Swing 应用程序需要一个主窗口,这个窗口通常由 JFrame 类来创建。
- 在左侧的
Package Explorer中,右键点击你的项目MyFirstGUI。 - 选择
New->Class。 - 在
Name字段中输入MyFrame作为类名。 - 关键一步:在 "Which interfaces would you like to create?" 部分,勾选
public static void main(String[] args),这会自动为你生成程序的主入口方法。 - 勾选
Inherited abstract methods,然后从列表中选择java.awt.WindowListener,这会自动为你生成处理窗口事件的模板代码(比如关闭窗口)。 - 点击
Finish。
Eclipse 会为你生成一个类似下面的文件 MyFrame.java:
package myfirstgui;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class MyFrame extends JFrame {
public MyFrame() {
// 构造函数
}
public static void main(String[] args) {
// 在事件分发线程中创建和显示GUI
SwingUtilities.invokeLater(new Runnable() {
public void run() {
MyFrame frame = new MyFrame();
frame.setVisible(true);
}
});
}
@Override
public void windowOpened(WindowEvent e) {
// 窗口打开时执行
}
@Override
public void windowClosing(WindowEvent e) {
// 窗口关闭时执行
// 默认行为是隐藏窗口,但我们希望退出程序
dispose(); // 释放窗口资源
System.exit(0); // 退出虚拟机
}
@Override
public void windowClosed(WindowEvent e) {
// 窗口关闭后执行
}
@Override
public void windowIconified(WindowEvent e) {
// 窗口最小化时执行
}
@Override
public void windowDeiconified(WindowEvent e) {
// 窗口从最小化恢复时执行
}
@Override
public void windowActivated(WindowEvent e) {
// 窗口激活时执行
}
@Override
public void windowDeactivated(WindowEvent e) {
// 窗口失去焦点时执行
}
}
代码解释:

import javax.swing.JFrame;: 导入 Swing 的窗口类。public class MyFrame extends JFrame: 我们的MyFrame类继承自JFrame,因此它就是一个窗口。SwingUtilities.invokeLater(...): 这是启动 Swing GUI 的标准做法,它确保所有 GUI 的创建和更新都在 事件分发线程 上执行,避免了多线程可能导致的问题。frame.setVisible(true);: 让窗口可见,在构造函数中设置可见性可能会导致问题,所以通常在构造完所有组件后再显示。windowClosing(WindowEvent e): 当用户点击窗口右上角的 "X" 按钮时,这个方法会被调用,我们调用dispose()和System.exit(0)来确保程序完全退出。
第 3 步:向窗口中添加组件
现在我们来给窗口添加一些基本的控件,比如一个标签、一个文本框和一个按钮。
- 打开
MyFrame.java文件。 - 修改
MyFrame的构造函数,添加以下代码:
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import java.awt.FlowLayout; // 使用流式布局管理器
public class MyFrame extends JFrame {
public MyFrame() {
// 1. 设置窗口标题
super("我的第一个 GUI 窗口");
// 2. 设置窗口大小
setSize(400, 200);
// 3. 设置窗口关闭操作
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 更简单的方式,代替了WindowListener
// 4. 设置布局管理器
// FlowLayout 会将组件从左到右、从上到下依次排列
setLayout(new FlowLayout());
// 5. 创建组件
JLabel label = new JLabel("请输入您的名字:");
JTextField textField = new JTextField(20); // 20列宽
JButton button = new JButton("点击我");
// 6. 将组件添加到窗口中
add(label);
add(textField);
add(button);
}
// main方法和windowClosing方法可以简化或保留
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
MyFrame frame = new MyFrame();
frame.setVisible(true);
}
});
}
// 简化后的windowClosing
@Override
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
}
// 其他WindowListener方法可以删除或保留为空
}
代码解释:
super("..."): 调用父类JFrame的构造函数来设置窗口标题。setSize(400, 200): 设置窗口的宽度和高度(单位:像素)。setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE): 这是处理窗口关闭最简单、最推荐的方式,它告诉程序,当窗口关闭时,整个 Java 程序应该退出,我们之前写的WindowListener现在可以被这个替代。setLayout(new FlowLayout()): 布局管理器 负责决定组件在窗口中的排列方式。FlowLayout是最简单的一种,它像文字一样从左到右排列,一行满了就换行。JLabel,JTextField,JButton: 这些都是 Swing 提供的常用组件。add(...): 将创建好的组件添加到窗口中。
你可以 运行 这个 MyFrame.java 文件,你应该能看到一个包含标签、文本框和按钮的窗口。
第 4 步:处理事件(例如按钮点击)
一个静态的界面没有太大用处,我们需要让按钮在被点击时执行某些操作,比如在文本框中显示欢迎信息。

在 Swing 中,我们通过 监听器 来处理事件。
- 我们需要一个地方来显示消息,比如另一个标签。
- 为按钮添加一个
ActionListener。
修改 MyFrame.java:
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MyFrame extends JFrame {
private JLabel messageLabel; // 将消息标签设为成员变量,以便在ActionListener中访问
public MyFrame() {
super("我的第一个 GUI 窗口");
setSize(400, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new FlowLayout());
// 创建组件
JLabel label = new JLabel("请输入您的名字:");
JTextField textField = new JTextField(20);
JButton button = new JButton("点击我");
messageLabel = new JLabel(""); // 初始为空
// 为按钮添加动作监听器
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 当按钮被点击时,此方法会被执行
String name = textField.getText(); // 获取文本框中的内容
String message = "你好, " + name + "!";
messageLabel.setText(message); // 在消息标签中显示
}
});
// 将组件添加到窗口中
add(label);
add(textField);
add(button);
add(messageLabel); // 添加消息标签
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
MyFrame frame = new MyFrame();
frame.setVisible(true);
}
});
}
}
代码解释:
import java.awt.event.ActionEvent;和import java.awt.event.ActionListener;: 导入事件相关的类。private JLabel messageLabel;: 将显示消息的JLabel声明为类的成员变量,这样在ActionListener内部就可以访问和修改它。button.addActionListener(...): 为按钮添加一个监听器。new ActionListener() { ... }: 我们创建了一个匿名的ActionListener对象。actionPerformed(ActionEvent e): 这是ActionListener接口中定义的方法,当按钮被点击时,Swing 框架会自动调用这个方法。textField.getText(): 获取JTextField中的文本内容。messageLabel.setText(...): 设置JLabel显示的文本。
现在再次运行程序,在文本框中输入你的名字,然后点击按钮,你应该会在按钮下方看到一条欢迎信息。
进阶:使用 Eclipse 的 GUI 设计器
对于更复杂的界面,手动编写 add() 语句会非常繁琐,Eclipse 提供了一个可视化的 GUI 设计器,可以让你通过拖拽组件来创建界面。
如何使用 GUI 设计器:
- 在
Package Explorer中,右键点击你的项目,选择New->Other。 - 在弹出的窗口中,展开
Swing文件夹,选择Swing Designer->GUI Form。 - 输入类名,
MyFrameDesigner,然后点击Finish。 - Eclipse 会打开一个可视化编辑器,左侧是组件面板,中间是设计区域,右侧是属性面板。
- 你可以从左侧面板拖拽组件(如
JButton,JTextField)到中间的设计区域。 - 选中一个组件,可以在右侧的属性面板中修改它的名称、文本、大小等。
- 双击一个按钮,Eclipse 会自动为你生成
actionPerformed方法的框架,你只需要在里面编写逻辑代码即可。
GUI 设计器的优点:
- 直观:所见即所得,布局非常方便。
- 快速:能快速构建复杂的界面。
- 代码生成:自动生成组件的声明和初始化代码。
GUI 设计器的缺点:
- 生成的代码可能冗长:有时会生成大量你不需要的代码。
- 对布局管理器的控制不如手动编码灵活。
- 学习曲线:需要花时间熟悉设计器的操作。
| 步骤 | 关键技术/概念 | 示例代码 |
|---|---|---|
| 创建项目 | Eclipse 新建 Java 项目 | File -> New -> Java Project |
| 创建窗口 | JFrame 类 |
public class MyFrame extends JFrame |
| 添加组件 | JLabel, JTextField, JButton |
add(new JLabel("Hello")); |
| 设置布局 | LayoutManager (如 FlowLayout) |
setLayout(new FlowLayout()); |
| 处理事件 | ActionListener |
button.addActionListener(...) |
| 运行程序 | SwingUtilities.invokeLater |
SwingUtilities.invokeLater(() -> { ... }); |
对于初学者,建议先手动编写代码来理解 Swing 的基本工作原理,熟悉之后再使用 GUI 设计器来提高开发效率,祝你学习愉快!
