简介
最后修改于 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 方法。此方法调用以下三个方法
- paintComponent()
- paintBorder()
- paintChildren()
在特定情况下,我们可能需要覆盖 paintBorder 或 paintChildren 方法。在大多数情况下,我们覆盖 paintComponent 方法。
Graphics 对象
paintComponent 的唯一参数是 Graphics 对象。它公开了许多用于绘制 2D 形状和获取应用程序图形环境信息的方法。Graphics2D 类扩展了 Graphics 类,以提供对几何、坐标转换、颜色管理和文本布局的更精细控制。
Graphics 对象在传递给 paintComponent 方法之前进行初始化,然后将其传递给 paintBorder 和 paintChildren 方法。这种重用提高了性能,但如果绘制代码永久更改 Graphics 状态,可能会导致问题。因此,我们必须恢复原始设置或使用 Graphics 对象的副本。副本使用 Graphics 的 create 方法创建;它必须稍后使用 dispose 方法释放。
实际上,如果我们设置以下属性:字体、颜色和渲染提示,则不需要创建 Graphics 对象的副本。对于所有其他属性(尤其是剪辑、组合操作和转换),我们必须创建 Graphics 对象的副本,然后稍后释放它。
简单的 Java 2D 示例
我们创建一个简单的 Java 2D 应用程序示例。
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 更新都是并发安全的。
引用
以下资源用于创建本教程
- Java Platform, Standard Edition 7 API 规范
- JH Labs
- 执行卷积操作
- Java 2D 演示代码示例
本部分 Java 2D 教程是对 Java 2D 库的介绍。