绘制图形

Java 可以分别使用 Graphics 类和 Graphics2D 类绘制图形,Graphics 类使用不同的方法实现不同图形的绘制。例如,drawLine() 方法可以绘制直线,drawRect() 方法用于绘制矩形,drawOval() 方法用于绘制椭圆形等。

【例19.1】绘制由5个圆形组成的图案(实例位置:资源包\TM\sl\19\1)

在项目中创建 DrawCircle 类,使该类继承 JFrame 类成为窗体组件,在类中创建继承 JPanel 类的 DrawPanel 内部类,并重写 paint() 方法,绘制由 5 个圆形组成的图案。

import java.awt.*;
import javax.swing.*;

public class DrawCircle extends JFrame {
	private final int OVAL_WIDTH = 80; // 圆形的宽
	private final int OVAL_HEIGHT = 80; // 圆形的高

	public DrawCircle() {
		initialize(); // 调用初始化方法
	}

	private void initialize() {// 初始化方法
		setSize(300, 200); // 设置窗体大小
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式
		setContentPane(new DrawPanel()); // 设置窗体面板为绘图面板对象
		setTitle("绘图实例1"); // 设置窗体标题
	}

	class DrawPanel extends JPanel {// 创建绘图面板
		public void paint(Graphics g) {// 重写绘制方法
			g.drawOval(10, 10, OVAL_WIDTH, OVAL_HEIGHT); // 绘制第1个圆形
			g.drawOval(80, 10, OVAL_WIDTH, OVAL_HEIGHT); // 绘制第2个圆形
			g.drawOval(150, 10, OVAL_WIDTH, OVAL_HEIGHT); // 绘制第3个圆形
			g.drawOval(50, 70, OVAL_WIDTH, OVAL_HEIGHT); // 绘制第4个圆形
			g.drawOval(120, 70, OVAL_WIDTH, OVAL_HEIGHT); // 绘制第5个圆形
		}
	}

	public static void main(String[] args) {
		new DrawCircle().setVisible(true);
	}
}

运行结果如图19.1所示。

image 2024 03 05 23 52 49 412
Figure 1. 图19.1 绘制由5个圆形组成的图案的窗体

Graphics 类常用的图形绘制方法如表19.1所示。

image 2024 03 06 09 55 59 343

Graphics2D 类是在继承 Graphics 类的基础上编写的,它包含了 Graphics 类的绘图方法并添加了更强的功能,在创建绘图类时推荐使用该类。Graphics2D 类可以分别使用不同的类来表示不同的形状,如 Line2D 类、Rectangle2D 类等。

要绘制指定形状的图形,需要先创建并初始化该图形类的对象,且这些图形类必须是 Shape 接口的实现类;然后使用 Graphics2D 类的 draw() 方法绘制该图形对象,或者使用 fill() 方法填充该图形对象。语法格式如下:

     draw(Shape form)

     fill(Shape form)

其中,form 是指实现 Shape 接口的对象。

java.awt.geom 包中提供了如下常用的图形类,这些图形类都实现了 Shape 接口:

  • Arc2D 类。

  • CubicCurve2D 类。

  • Ellipse2D 类。

  • Line2D 类。

  • Point2D 类。

  • QuadCurve2D 类。

  • Rectangle2D 类。

  • RoundRectangle2D 类。

各图形类都是抽象类型的。在不同图形类中有 Double 和 Float 两个实现类,这两个实现类以不同精度构建图形对象。为方便计算,在程序开发中经常使用 Double 类的实例对象绘制图形,但是如果程序中要使用成千上万个图形,则建议使用 Float 类的实例对象进行绘制,这样会节省内存空间。

【例19.2】绘制空心和实心的集合图形(实例位置:资源包\TM\sl\19\2)

在窗体的实现类中创建图形类的对象,然后使用 Graphics2D 类绘制和填充这些图形。

import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;

public class DrawFrame extends JFrame {
	public DrawFrame() {
		setTitle("绘图实例2"); // 设置窗体标题
		setSize(300, 200); // 设置窗体大小
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式
		add(new CanvasPanel()); // 设置窗体面板为绘图面板对象

	}

	class CanvasPanel extends JPanel {// 绘图变慢
		public void paint(Graphics g) {
			Graphics2D g2 = (Graphics2D) g;
			Shape[] shapes = new Shape[4]; // 声明图形数组
			shapes[0] = new Ellipse2D.Double(5, 5, 100, 100); // 创建圆形对象
			shapes[1] = new Rectangle2D.Double(110, 5, 100, 100); // 创建矩形对象

			shapes[2] = new Rectangle2D.Double(15, 15, 80, 80); // 创建矩形对象
			shapes[3] = new Ellipse2D.Double(120, 15, 80, 80); // 创建圆形对象
			for (Shape shape : shapes) { // 遍历图形数组
				Rectangle2D bounds = shape.getBounds2D();
				if (bounds.getWidth() == 80)
					g2.fill(shape); // 填充图形
				else
					g2.draw(shape); // 绘制图形
			}
		}
	}

	public static void main(String[] args) {
		new DrawFrame().setVisible(true);
	}
}

运行结果如图19.2所示。

image 2024 03 06 10 03 59 069

编程训练(答案位置:资源包\TM\sl\19\编程训练)

【训练1】绘制空心和实心的椭圆 在窗体上绘制空心和实心的椭圆,运行效果如图19.3所示。

【训练2】绘制多边形 在窗体上绘制多边形,运行效果如图19.4所示。

image 2024 03 06 10 04 52 440
Figure 2. 图19.3 绘制空心和实心的椭圆
image 2024 03 06 10 05 20 010
Figure 3. 图19.4 绘制多边形