绘制图形
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所示。

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

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所示。

编程训练(答案位置:资源包\TM\sl\19\编程训练)
【训练1】绘制空心和实心的椭圆 在窗体上绘制空心和实心的椭圆,运行效果如图19.3所示。
【训练2】绘制多边形 在窗体上绘制多边形,运行效果如图19.4所示。

