AWT 绘图
AWT 绘图
一、Java 绘图基础
- 应用程序的闪屏图像、背景图和组件外观,都需要用到绘图,Java 中使用绘图类 Graphics 和 Graphics2D 以及画布类 Canvas,来进行绘图的相关功能实现。
1、Graphics 类
- Graphics 类是所有图形上下文的基类,封装了 Java 支持的基本绘图操作所需的状态信息:颜色、字体、画笔、文本和图像等。
- Graphics 类提供了绘图常用的方法,利用这些方法可以实现直线、矩形、多边形、椭圆、圆弧等形状和文本、图像的绘制操作,同时也提供设置如颜色、字体等状态属性的方法。
2、Graphics2D 类
- 该类主要是弥补 Graphics 类的不足,Graphics 类无法改变线条的粗细、不能对图像使用旋转和模糊等过滤效果。
- Graphics2D 类继承自 Graphics 类,实现了功能强大的绘图操作。
3、Canvas 类
- Canvas 类是一个画布组件,表示屏幕上的一个空白矩形区域,应用可以在该区域进行绘图,或者可以从该区域捕获用户的输入事件。
- Java 应用程序中,要在窗体中绘图,必须继承 Canvas 类的子类,从而获得有用的功能,然会重写 paint 方法,以便能够自定义图形。
二、绘制几何图形
- Java 中使用 Graphics 类和 GraphicsD 类的方法可以实现不同图形的绘制。
- Graphics 类常用的图形绘制方法如下表:
方法 说明 drawArc(int x,int y,int width,int height,int startAngle,int arcAngle) 弧形 drawLine(int x1,int y1,int x2,int y2) 直线 drawOval(int x,int y,int width,int height) 椭圆 drawPolygon(int[] xPoints,int[] yPoints,int nPoints) 多边形 drawPolyline(int[] xPoints,int[] yPoints,int nPoints) 多边线 drawRect(int x,int y,int width,int height) 矩形 drawRoundRect(int x,int y,int width,int height,int arcWidth,int arcHeight) 圆角矩形 fillArc(int x,int y,int width,int height,int startAngle,int arcAngle ) 实心弧形 fillOval(int x,int y,int width,int height) 实心椭圆 fillPolygon(int[] xPoints,int[] yPoints,int nPoints) 实心多边形 fillRect(int x,int y,int width,int height) 实心矩形 fillRoundRect(int x,int y,int width,int height,int arcWidth,int arcHeight) 实心圆角矩形 - Graphics2D 类是继承 Graphics 类,并添加了更强劲的功能,Graphics2D 可以分别使用不同的类表示不同的形状,如 Line2D、Rectangle2D 等。
- 要绘制指定形状的图形,首先要创建并初始化该图形类的对象,这些图形类必须是 Shape 接口的实现类,然后用 Graphics2D 的 draw() 方法绘制图形对象或者使用 fill() 方法填充该图形对象。
- java.awt.geom 包中提供了如下一些常用图形类,这些图形类都实现了 Shape 接口:
1)arc2D:所有存储 2D 弧度的对象的抽象超类,其中 2D 弧度由窗体矩形、起始角度、角跨越(弧的长度)和闭合类型(OPEN、CHORD 或 PIE)定义。
2)CubicCurve2D:定义 (x,y) 坐标空间内的三次参数曲线段。
3)Ellipse2D:描述窗体矩形定义的椭圆。
4)Line2D:(x,y) 坐标空间中的线段。
5)Path2D:提供一个表示仍以几何形状路径的简单又灵活的形状。
6)QuadCurve2D:定义 (x,y) 坐标空间
7)Rectangle2D:描述通过位置 (x,y) 和 尺寸 (w x h) 定义的矩形。
8)RoundRectangle2D:定义一个矩形,該矩形具有由位置 (x,y)、尺寸 (w x h) 以及圆角弧的宽度和高度定义的圆角。 - 另外有一个实现 Cloneable 接口的 Point2D 类,该类定义了表示 (x,y) 坐标空间中位置的点。
- 各图形类都是抽象类,在不同图形类中有 Double 和 Float 两个实现类,以构建不同精度的图像,通常情况采用 Double 类的实例对象进行图形绘制,但是如果程序中图形的数量庞大,则使用 Float 类的实例对象较为合适,这样可以节省内存空间。
- Java 程序中绘制图形步骤基本如下:
1)创建 JFrame 窗体对象;
2)创建 Canvas 画布,并重写 paint 方法;
3)创建 Graphics2D 或者 Graphics 对象,
4)根据需要,设置颜色以及画笔;
5)调用 Graphics2D 对象的相应方法绘制图形。 - 示例
package AWT绘图; // !/usr/bin/env jdk1.8 // encoding:utf-8 //@software:IntelliJ IDEA //@pack:AWT绘图 //@user:彭友聪 //@date:2019/08/11 //@time:上午 8:48 //@project:IDEA_JAVA //@file:DrawTest.java //Author:御承扬 //email:2923616405@qq.com import javax.swing.*; import java.awt.*; import java.awt.geom.Ellipse2D; import java.awt.geom.Rectangle2D; public class DrawTest extends JFrame { static class CanvasTest extends Canvas { private CanvasTest(){ } public final void paint(Graphics g){ super.paint( g ); Graphics2D g2 = (Graphics2D) g; g2.drawOval( 5, 5, 100, 100 ); // 绘制圆形 g2.fillRect( 15, 15, 80, 80 ); // 绘制实心矩形 Shape[] shapes = new Shape[2]; // 声明图形数组 shapes[0] = new Rectangle2D.Double( 110, 5, 100, 100 ); shapes[1] = 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); // 绘制图形 } } } private void initialize() { this.setSize( 300, 200 ); setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE ); add(new CanvasTest()); this.setTitle( "绘制几何图形示例" ); } private DrawTest() { super(); initialize(); } public static void main(String[] args) { new DrawTest().setVisible( true ); } }
- 运行结果如下图:
三、设置颜色和画笔
- Java 中的 java.awt.Color 类封装颜色的各种属性,并对颜色进行管理。
- 绘制图形时可以指定线条的粗细和虚实等画笔属性,该属性通过 Stroke 接口指定。
1、设置颜色
- Color 类可以创建任何颜色的对象,其构造方法如下:
Color col = new Color(int r, int g, int b); Color col = new Color(int rgb)
- 为了方便开发者的使用,Color 类定义了常用色彩的常量值,如下表:
常量名 颜色值 Color.BLACK 黑色 Color.BLUE 蓝色 Color.CYAN 青色 Color.DARK_GRAY 深灰色 Color.GRAY 灰色 Color.GREEN 绿色 Color.LIGHT_GRAY 浅灰色 Color.MAGENTA 洋红色 Color.ORANGE 桔黄色 Color.PINK 粉红色 Color.RED 红色 Color.WHITE 白色 Color.YELLOW 黄色 - 绘图类可以用 setColor(Color color) 方法进行设置。
- 示例:
// >= JDK 1.8 // encoding:utf-8 // @software:IntelliJ IDEA // @user:彭友聪 // @date:2019/08/14 // @time:下午 3:59 // @project:IDEA_JAVA // @file:ColorTest.java // @Author:御承扬 //@E-mail:2923616405@qq.com package AWT绘图; import javax.swing.*; import java.awt.*; public class ColorTest extends JFrame { static class CanvasTest extends Canvas { CanvasTest() { } public final void paint(Graphics g){ super.paint( g ); Graphics2D g2 = (Graphics2D) g; g2.setColor(Color.RED); g2.drawLine( 5, 30, 100, 30 ); } } private void initialize(){ this.setSize( 300,200 ); setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE ); add(new CanvasTest()); // 设置窗体面板为绘图面板对象 this.setTitle("设置颜色"); } public ColorTest() { super(); initialize(); } public static void main(String[] args) { ColorTest frame = new ColorTest(); frame.setVisible( true ); } }
- 效果如下:
2、设置画笔
- 默认情况下,Graphics 绘图类使用的画笔属性是粗细为 1 个像素的正方形,而 Graphics2D 类则可以调用 setStroke() 方法设置画笔的属性;setStroke() 方法必须接受一个 Stroke 接口的实现类做参数,java.awt 包中提供实现了 Stroke 接口的 BasicStroke 类,并通过不同构方法创建不同属性的画笔:
1)BasicStroke()‘
2)BasicStroke(float width)
3)BasicStroke(float width, int cap, int join)
4)BasicStroke(float width, int cap, int join, float miterlimit)
5)BasicStroke(float width, int cap, int join, float miterlimit, float[] dash, float dash_phase) - 相关参数说明
参数 说明 width 画笔宽度,此宽度必须大于或等于 0.0f。若果宽度设置为 0.0f ,则将画笔设置为当前设备的默认宽度 cap 线端点的装饰 join 应用在路径线段交汇处的装饰 miterlimit 斜接处的剪裁限制,该参数值必须大于或等于1.0f dash 表示虚线模式的数组 dash_phase 开始虚线模式的偏移量 - 示例:
// >= JDK 1.8 // encoding:utf-8 // @software:IntelliJ IDEA // @user:彭友聪 // @date:2019/08/14 // @time:下午 4:40 // @project:IDEA_JAVA // @file:StrokeTest.java // @Author:御承扬 //@E-mail:2923616405@qq.com package AWT绘图; import javax.swing.*; import java.awt.*; public class StrokeTest extends JFrame { static class CanvasTest extends Canvas { CanvasTest() { } public final void paint(Graphics g){ super.paint( g ); Graphics2D g2 = (Graphics2D) g; // 创建画笔,宽度为 8 Stroke stroke = new BasicStroke( 8 ); g2.setStroke( stroke ); g2.drawLine( 20, 30, 120, 30 ); // 创建画笔,宽度 12,线端点装饰用 CAP_ROUND,应用在路径线段交汇处的装饰为 JOIN_BEVEL Stroke roundStroke = new BasicStroke( 12, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL ); g2.setStroke( roundStroke ); g2.drawLine( 20, 50, 120, 50 ); } } private void initialize(){ this.setSize( 300,200 ); setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE ); add(new CanvasTest()); // 设置窗体面板为绘图面板对象 this.setTitle("设置画笔"); } private StrokeTest() { super(); initialize(); } public static void main(String[] args) { StrokeTest frame = new StrokeTest(); frame.setVisible( true ); } }
- 运行效果如下:
四、绘制文本
1、设置字体
- Java 中的 Font 类封装了字体的大小、样式等属性,位于 java.awt 包中,其构造方法可以指定字体的名称、大小和样式,语法如下:
Font(String name, int style, int size) // name:字体名称 // style:字体样式 // size:字体大小
- 其中字体样式的取值有如下:
1)Font.PLAIN:普通样式
2)Font.BOLD:粗体样式
3)Font.ITALIC:斜体样式 - 绘图类的字体可以用 setFont(Font font) 方法来设置。
2、绘制文字
- Graphics2D 类提供了 drawString() 方法用于绘制文字,语法如下:
drawString(String str, int x, int y) drawString(String str, float x, float y) /* str:要绘制的文本字符串。 x:要绘制字符串的水平起始位置。 y:要绘制的字符串的垂直起始位置。 */
- 示例:
// >= JDK 1.8 // encoding:utf-8 // @software:IntelliJ IDEA // @user:彭友聪 // @date:2019/08/15 // @time:下午 4:18 // @project:IDEA_JAVA // @file:DrawStringTest.java // @Author:御承扬 //@E-mail:2923616405@qq.com package AWT绘图; import javax.swing.*; import java.awt.*; public class DrawStringTest extends JFrame { static class CanvasTest extends Canvas { CanvasTest() { } public final void paint(Graphics g){ super.paint( g ); Graphics2D g2 = (Graphics2D) g; g2.setColor( Color.BLUE ); Font font = new Font( "楷体", Font.BOLD, 16 ); g2.setFont( font ); g2.drawString( "Done is better than perfect.", 20, 30 ); g2.drawString( "——比完美更重要是完成。", 60, 60 ); } } private DrawStringTest() { this.setSize( 310, 140 ); setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE ); add(new CanvasTest()); this.setTitle( "绘制文本" ); } public static void main(String[] args) { DrawStringTest frame = new DrawStringTest(); frame.setVisible( true ); } }
- 运行效果如下: