Skip to content

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 应用程序通常由以下几个核心部分组成:

  1. 顶级容器 (Top-Level Containers): GUI 的起点,是其他所有组件的载体。

    • JFrame: 代表一个标准的窗口,有标题栏、边框和控制按钮(最小化、最大化、关闭)。
    • JDialog: 代表一个对话框。
    • JApplet: 用于在浏览器中运行的 Java 小程序(现已过时)。
  2. 中间容器 (Intermediate Containers): 用于组织和布局其他组件。

    • JPanel: 最常用的通用容器,可以将其看作一块画板,用于对组件进行分组。
  3. 原子组件 (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 是一个值得投入时间的方向。

本站内容仅供学习和研究使用。