Java GUI 编程
除了命令行和 Web 应用程序,Java 也能够创建功能丰富的桌面图形用户界面(GUI)应用程序。Java 提供了两个主要的 GUI 工具包:Swing 和 JavaFX。
- AWT (Abstract Window Toolkit): Java 最早的 GUI 工具包,严重依赖于本地操作系统的 GUI 组件。现在已很少直接使用。
- Swing: 构建在 AWT 之上,提供了更丰富、更灵活的“轻量级”组件(完全由 Java 绘制),实现了跨平台一致的外观和感觉。
- JavaFX: 作为 Swing 的现代继承者,提供了更现代的 API、对 CSS 的支持、3D 图形以及更丰富的媒体功能。从 JDK 11 开始,JavaFX 已从标准库中分离出来,需要作为独立的模块添加。
本章将主要介绍较为经典的 Swing。
Swing 基础
一个 Swing 应用程序通常由以下几个核心部分组成:
顶级容器 (Top-Level Containers): GUI 的起点,是其他所有组件的载体。
JFrame: 代表一个标准的窗口,有标题栏、边框和控制按钮(最小化、最大化、关闭)。JDialog: 代表一个对话框。JApplet: 用于在浏览器中运行的 Java 小程序(现已过时)。
中间容器 (Intermediate Containers): 用于组织和布局其他组件。
JPanel: 最常用的通用容器,可以将其看作一块画板,用于对组件进行分组。
原子组件 (Atomic Components): 用户直接与之交互的基本控件。
JButton: 按钮。JLabel: 文本标签。JTextField: 单行文本输入框。JTextArea: 多行文本区域。JCheckBox: 复选框。JRadioButton: 单选按钮。
创建第一个 Swing 窗口
java
import javax.swing.JFrame;
public class FirstWindow {
public static void main(String[] args) {
// 1. 创建一个 JFrame 对象
JFrame frame = new JFrame("我的第一个 GUI 窗口");
// 2. 设置窗口关闭时的默认操作
// EXIT_ON_CLOSE 表示关闭窗口时退出应用程序
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 3. 设置窗口的大小(单位:像素)
frame.setSize(400, 300);
// 4. 让窗口可见
frame.setVisible(true);
}
}布局管理器 (Layout Managers)
布局管理器负责决定容器中组件的大小和位置。直接设置组件的绝对坐标 (null 布局) 是不推荐的,因为它无法适应不同屏幕尺寸和分辨率。
FlowLayout: 默认的JPanel布局。组件像流水一样从左到右排列,一行放不下时会自动换行。BorderLayout: 默认的JFrame布局。将容器分为五个区域:NORTH,SOUTH,EAST,WEST,CENTER。GridLayout: 将容器划分为大小相等的网格,每个组件占据一个单元格。
事件处理
GUI 应用程序是事件驱动的。当用户与组件交互时(如点击按钮),就会产生一个事件。我们需要编写事件监听器 (Event Listener) 来响应这些事件。
示例:一个简单的计数器
java
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class CounterApp {
private static int count = 0;
public static void main(String[] args) {
JFrame frame = new JFrame("简单计数器");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
// 创建一个面板
JPanel panel = new JPanel();
frame.add(panel);
// 创建组件
JLabel label = new JLabel("点击次数: 0");
JButton button = new JButton("点我!");
// 将组件添加到面板
panel.add(label);
panel.add(button);
// 为按钮添加事件监听器
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 事件发生时执行的代码
count++;
label.setText("点击次数: " + count);
}
});
frame.setVisible(true);
}
}关于 JavaFX
虽然 Swing 仍然可用且功能强大,但对于新的桌面应用程序项目,JavaFX 是 Oracle 官方推荐的现代替代方案。它提供了更丰富的 API,支持 FXML(一种基于 XML 的标记语言来定义界面),可以使用 CSS 来美化样式,并且更好地集成了现代硬件加速功能。如果打算深入学习 Java GUI 开发,JavaFX 是一个值得投入时间的方向。