# 介绍

> 原文： [https://zetcode.com/gfx/java2d/introduction/](https://zetcode.com/gfx/java2d/introduction/)

在 Java 2D 教程的这一部分中，我们将介绍 Java 2D 技术。

## 关于

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

## 矢量图形

有两种不同的计算机图形：矢量图形和栅格图形。 栅格（位图）图形将图像表示为像素的集合。 矢量图形是使用诸如点，线，曲线或多边形之类的几何图元来表示图像。 这些基元是使用数学方程式创建的。 两种类型的计算机图形都有优点和缺点。 矢量图形的优点是：

*   较小的大小
*   无限放大的能力
*   移动，缩放，填充或旋转不会降低图像质量

Java 2D API 提供了可用于矢量和栅格图形的工具。

## Java 2D API

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

Java 2D API 提供以下功能：

*   用于显示设备和打印机的统一渲染模型
*   多种几何图元
*   形状，文字和图像的命中检测
*   合成模型
*   增强的色彩支持
*   打印文件
*   控制渲染质量

Java 2D API 增强了 Abstract Windowing Toolkit（AWT）的图形，文本和图像处理功能。 AWT 是用于在 Java 中创建用户界面和图形的原始工具包。 出于兼容性目的，Java 2D 从技术上讲是 AWT 工具箱的超集。

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

## 绘画机制

自定义绘画代码应放在`paintComponent()`方法中。 该在绘制时调用此方法。 绘画子系统首先调用`paint()`方法。 此方法调用以下三个方法：

*   `paintComponent()`
*   `paintBorder()`
*   `paintChildren()`

在特定情况下，我们可能想覆盖`paintBorder()`或`paintChildren()`方法。 在大多数情况下，我们将覆盖`paintComponent()`方法。

## 图形对象

唯一的`paintComponent's`参数是`Graphics`对象。 它公开了许多绘制 2D 形状和获取有关应用图形环境的信息的方法。 `Graphics2D`类扩展了`Graphics`类，以提供对几何，坐标转换，颜色管理和文本布局的更复杂的控制。

在将`Graphics`对象传递给`paintComponent()`方法之前，先对其进行初始化，然后将其转换为`paintBorder()`和`paintChildren()`方法。 这种重用可以提高性能，但是如果绘画代码永久更改`Graphics`状态，则可能会导致问题。 因此，我们必须恢复原始设置或使用`Graphics`对象的副本。 该副本是使用`Graphics`的`create()`方法创建的； 必须稍后使用`dispose()`方法将其释放。

实际上，如果我们设置以下属性：字体，颜色和呈现提示，则无需创建`Graphics`对象的副本。 对于所有其他属性（尤其是剪裁，复合操作和转换），我们必须创建`Graphics`对象的副本并在以后处置它。

## 简单的 Java 2D 示例

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

`SimpleEx.java`

```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 教程中的许多代码都重复了。

```java
class Surface extends JPanel {
...
}

```

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

```java
Graphics2D g2d = (Graphics2D) g;

```

`Graphics2D`类是用于在 Java 2D 中渲染图形的基本类。 它以通用方式表示设备数量。 它扩展了旧的`Graphics`对象。 要进行所有高级操作，必须进行此转换。

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

```

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

```java
@Override
public void paintComponent(Graphics g) {

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

```

自定义绘画是在`paintComponent()`方法内部执行的，我们将其覆盖。 `super.paintComponent()`方法调用父类的方法。 准备用于绘图的组件会做一些必要的工作。 我们将图形委托给`doDrawing()`方法。

```java
private void initUI() {
...
}

```

`initUI()`方法启动应用的用户界面。

```java
add(new Surface());

```

该表面已添加到`JFrame`容器中。

```java
EventQueue.invokeLater(new Runnable() {

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

```

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

![Simple Java 2D example](img/f5a2c7a82b31c589c2e59e9fafa286ea.jpg)

图：简单 Java 2D example

## 参考

以下资源用于创建本教程：

*   [Java 平台，标准版 7 API 规范](http://docs.oracle.com/javase/7/docs/api/)
*   [JH Labs](http://www.jhlabs.com/java/java2d/reflections/index.html)
*   [执行卷积运算](http://developer.apple.com/library/mac/#documentation/Performance/Conceptual/vImage/ConvolutionOperations/ConvolutionOperations.html#//apple_ref/doc/uid/TP30001001-CH205-SW1)
*   Java 2D 演示代码示例

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