原文: 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对象的副本。 该副本是使用Graphicscreate()方法创建的; 必须稍后使用dispose()方法将其释放。

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

简单的 Java 2D 示例

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

SimpleEx.java

  1. package com.zetcode;
  2. import java.awt.EventQueue;
  3. import java.awt.Graphics;
  4. import java.awt.Graphics2D;
  5. import javax.swing.JFrame;
  6. import javax.swing.JPanel;
  7. class Surface extends JPanel {
  8. private void doDrawing(Graphics g) {
  9. Graphics2D g2d = (Graphics2D) g;
  10. g2d.drawString("Java 2D", 50, 50);
  11. }
  12. @Override
  13. public void paintComponent(Graphics g) {
  14. super.paintComponent(g);
  15. doDrawing(g);
  16. }
  17. }
  18. public class BasicEx extends JFrame {
  19. public BasicEx() {
  20. initUI();
  21. }
  22. private void initUI() {
  23. add(new Surface());
  24. setTitle("Simple Java 2D example");
  25. setSize(300, 200);
  26. setLocationRelativeTo(null);
  27. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  28. }
  29. public static void main(String[] args) {
  30. EventQueue.invokeLater(new Runnable() {
  31. @Override
  32. public void run() {
  33. BasicEx ex = new BasicEx();
  34. ex.setVisible(true);
  35. }
  36. });
  37. }
  38. }

我们在JPanel组件上绘制文本。 Java 2D 教程中的许多代码都重复了。

  1. class Surface extends JPanel {
  2. ...
  3. }

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

  1. Graphics2D g2d = (Graphics2D) g;

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

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

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

  1. @Override
  2. public void paintComponent(Graphics g) {
  3. super.paintComponent(g);
  4. doDrawing(g);
  5. }

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

  1. private void initUI() {
  2. ...
  3. }

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

  1. add(new Surface());

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

  1. EventQueue.invokeLater(new Runnable() {
  2. @Override
  3. public void run() {
  4. BasicEx ex = new BasicEx();
  5. ex.setVisible(true);
  6. }
  7. });

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

介绍 - 图1

图:简单 Java 2D example

参考

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

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