ZetCode

简介

最后修改于 2023 年 7 月 17 日

在本部分 Java 2D 教程中,我们将介绍 Java 2D 技术。

关于

这是 Java 2D 教程。面向初学者。本教程将教您 Java 2D 编程的基础知识。本教程中使用的图像可在此处下载:此处

矢量图形

有两种不同的计算机图形:矢量和栅格图形。栅格(位图)图形将图像表示为像素的集合。矢量图形是使用点、线、曲线或多边形等几何图元来表示图像。这些图元是使用数学方程创建的。两种类型的计算机图形都有其优点和缺点。矢量图形的优点是

Java 2D API 提供了处理矢量和栅格图形的工具。

Java 2D API

Java 2D 是一个使用 Java 编程语言绘制二维图形的 API。

Java 2D API 提供以下功能

Java 2D API 增强了抽象窗口工具包 (AWT) 的图形、文本和成像功能。AWT 是 Java 中创建用户界面和图形的原始工具包。出于兼容性目的,Java 2D 在技术上是 AWT 工具包的超集。

Java 2D 是一项强大的技术。它可以用于创建丰富的用户界面、游戏、动画、多媒体应用程序或各种特殊效果。

绘制机制

自定义绘制代码应放在 paintComponent 方法中。当需要绘制时会调用此方法。绘制子系统首先调用 paint 方法。此方法调用以下三个方法

在特定情况下,我们可能需要覆盖 paintBorderpaintChildren 方法。在大多数情况下,我们覆盖 paintComponent 方法。

Graphics 对象

paintComponent 的唯一参数是 Graphics 对象。它公开了许多用于绘制 2D 形状和获取应用程序图形环境信息的方法。Graphics2D 类扩展了 Graphics 类,以提供对几何、坐标转换、颜色管理和文本布局的更精细控制。

Graphics 对象在传递给 paintComponent 方法之前进行初始化,然后将其传递给 paintBorderpaintChildren 方法。这种重用提高了性能,但如果绘制代码永久更改 Graphics 状态,可能会导致问题。因此,我们必须恢复原始设置或使用 Graphics 对象的副本。副本使用 Graphicscreate 方法创建;它必须稍后使用 dispose 方法释放。

实际上,如果我们设置以下属性:字体、颜色和渲染提示,则不需要创建 Graphics 对象的副本。对于所有其他属性(尤其是剪辑、组合操作和转换),我们必须创建 Graphics 对象的副本,然后稍后释放它。

简单的 Java 2D 示例

我们创建一个简单的 Java 2D 应用程序示例。

com/zetcode/SimpleEx.java
package com.zetcode;

import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;

class Surface extends JPanel {

    private void doDrawing(Graphics g) {

        Graphics2D g2d = (Graphics2D) g;
        g2d.drawString("Java 2D", 50, 50);
    }

    @Override
    public void paintComponent(Graphics g) {

        super.paintComponent(g);
        doDrawing(g);
    }
}

public class BasicEx extends JFrame {

    public BasicEx() {

        initUI();
    }

    private void initUI() {

        add(new Surface());

        setTitle("Simple Java 2D example");
        setSize(300, 200);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                BasicEx ex = new BasicEx();
                ex.setVisible(true);
            }
        });
    }
}

我们在 JPanel 组件上绘制文本。Java 2D 教程中的大部分代码都会重复。

class Surface extends JPanel {
...
}

我们创建了一个 Surface 类。此类将成为我们的绘图面板。它继承自 JPanel 组件。

Graphics2D g2d = (Graphics2D) g;

Graphics2D 类是 Java 2D 中渲染图形的基础类。它以通用方式表示许多设备。它扩展了旧的 Graphics 对象。这种类型转换对于访问所有高级操作是必需的。

g2d.drawString("Java 2D", 50, 50);

在这里,我们使用 drawString 方法在面板上绘制一个字符串。

@Override
public void paintComponent(Graphics g) {

    super.paintComponent(g);
    doDrawing(g);
}

自定义绘制在 paintComponent 方法中执行,我们对其进行了覆盖。super.paintComponent 方法调用父类的方法。它执行一些必要的工作来准备组件进行绘制。我们将绘制委托给 doDrawing 方法。

private void initUI() {
...
}

initUI 方法初始化应用程序的用户界面。

add(new Surface());

Surface 被添加到 JFrame 容器中。

EventQueue.invokeLater(new Runnable() {

    @Override
    public void run() {
        BasicEx ex = new BasicEx();
        ex.setVisible(true);
    }
});

我们创建我们代码示例的实例,并使其在屏幕上可见。invokeLater 方法将应用程序放入 Swing 事件队列。它用于确保所有 UI 更新都是并发安全的。

Simple Java 2D example
图:简单的 Java 2D 示例

引用

以下资源用于创建本教程

本部分 Java 2D 教程是对 Java 2D 库的介绍。