Java Graphics和Graphics2D用法详解(附带实例)
要开发高级应用程序,就必须掌握一定的图像处理技术。Java 绘图是 Java 程序开发不可缺少的技术,使用这些技术可以为程序提供数据统计、图表分析等功能,还可以为程序搭配音效,提高程序的交互能力。
例如,应用程序可以绘制闪屏图片、背景图片、组件外观等,Web程序可以绘制统计图、数据库中存储的图片资源等。正所谓“一图胜千言”,使用图片能够更好地表达程序的运行结果,并且能够进行细致的数据分析与保存等。
本节介绍 Java 程序设计中的绘图类 Graphics 与 Graphics2D。
Graphics 类封装了 Java 支持的基本绘图操作所需的状态信息,主要包括颜色、字体、画笔、文本、图像等。
Graphics 类提供了绘图常用的方法,利用这些方法可以实现直线、矩形、多边形、椭圆、圆弧等形状和文本、图片的绘制操作。另外,在执行这些操作之前,还可以使用相应的方法设置绘图的颜色和字体等状态属性。
Graphics 类常用的图形绘制方法如下表所示:
【实例】绘制由 5 个圆形组成的图案。在项目中创建 DrawCircle 类,使该类继承 JFrame 类成为窗体组件,在类中创建继承 JPanel 类的 DrawPanel 内部类,并重写 paint() 方法,绘制由 5 个圆形组成的图案。

图 1 绘制由5个圆形组成的图案的窗体
Graphics2D 类继承 Graphics 类,实现了功能更加强大的绘图操作的集合。由于 Graphics2D 类是 Graphics 类的扩展,也是推荐使用的 Java 绘图类。
Graphics2D 类是在继承 Graphics 类的基础上编写的,它包含了 Graphics 类的绘图方法并添加了更强的功能,在创建绘图类时推荐使用该类。Graphics2D 类可以分别使用不同的类来表示不同的形状,如 Line2D 类、Rectangle2D 类等。
要绘制指定形状的图形,需要先创建并初始化该图形类的对象,且这些图形类必须是 Shape 接口的实现类;然后使用 Graphics2D 类的 draw() 方法绘制该图形对象,或者使用 fill() 方法填充该图形对象。语法格式如下:
java.awt.geom 包中提供了如下常用的图形类,这些图形类都实现了 Shape 接口:
注意,各图形类都是抽象类型的。在不同图形类中有 Double 和 Float 两个实现类,这两个实现类以不同精度构建图形对象。为方便计算,在程序开发中经常使用 Double 类的实例对象绘制图形,但是如果程序中要使用成千上万个图形,则建议使用 Float 类的实例对象进行绘制,这样会节省内存空间。
【实例】绘制空心和实心的集合图形。在窗体的实现类中创建图形类的对象,然后使用 Graphics2D 类绘制和填充这些图形。

图 2 运行结果
例如,应用程序可以绘制闪屏图片、背景图片、组件外观等,Web程序可以绘制统计图、数据库中存储的图片资源等。正所谓“一图胜千言”,使用图片能够更好地表达程序的运行结果,并且能够进行细致的数据分析与保存等。
本节介绍 Java 程序设计中的绘图类 Graphics 与 Graphics2D。
Java Graphics类
Graphics 类是所有图形上下文的抽象基类,它允许应用程序在组件以及闭屏图像上进行绘制。Graphics 类封装了 Java 支持的基本绘图操作所需的状态信息,主要包括颜色、字体、画笔、文本、图像等。
Graphics 类提供了绘图常用的方法,利用这些方法可以实现直线、矩形、多边形、椭圆、圆弧等形状和文本、图片的绘制操作。另外,在执行这些操作之前,还可以使用相应的方法设置绘图的颜色和字体等状态属性。
Graphics 类常用的图形绘制方法如下表所示:
方法 | 说明 | 举例 |
---|---|---|
drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) | 弧形 | drawArc(100,100,100,50,270,200); |
drawLine(int x1, int y1, int x2, int y2) | 直线 |
drawLine(10,10,50,10); drawLine(30,10,30,40); |
drawOval(int x, int y, int width, int height) | 椭圆 | drawOval(10,10,50,30); |
drawPolygon(int[] xPoints, int[] yPoints, int nPoints) | 多边形 |
int[] xs={10,50,10,50}; int[] ys={10,50,50,10}; drawPolygon(xs, ys, 4); |
drawPolyline(int[] xPoints, int[] yPoints, int nPoints) | 多边线 |
int[] xs={10,50,10,50}; int[] ys={10,10,50,50}; drawPolyline(xs, ys, 4); |
drawRect(int x, int y, int width, int height) | 矩形 | drawRect(10, 10, 100, 50); |
drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) | 圆角矩形 | drawRoundRect(10,10,50,30,10,10); |
fillArc(int x, int y, int width, int height, int startAngle, int arcAngle) | 实心弧形 | fillArc(100,100,50,30,270,200); |
fillOval(int x, int y, int width, int height) | 实心椭圆 | fillOval(10,10,50,30); |
fillPolygon(int[] xPoints, int[] yPoints, int nPoints) | 实心多边形 |
int[] xs={10,50,10,50}; int[] ys={10,50,50,10}; fillPolygon(xs, ys, 4); |
fillRect(int x, int y, int width, int height) | 实心矩形 | fillRect(10,10,50,30); |
fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) | 实心圆角矩形 | g.fillRoundRect(10,10,50,30,10,10); |
【实例】绘制由 5 个圆形组成的图案。在项目中创建 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); } }运行结果如下图所示:

图 1 绘制由5个圆形组成的图案的窗体
Java Graphics2D类
使用 Graphics 类可以完成简单的图形绘制任务,但是它所实现的功能非常有限,如无法改变线条的粗细、不能对图片使用旋转和模糊等过滤效果。Graphics2D 类继承 Graphics 类,实现了功能更加强大的绘图操作的集合。由于 Graphics2D 类是 Graphics 类的扩展,也是推荐使用的 Java 绘图类。
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 类的实例对象进行绘制,这样会节省内存空间。
【实例】绘制空心和实心的集合图形。在窗体的实现类中创建图形类的对象,然后使用 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); } }运行结果如下图所示:

图 2 运行结果