Java— AWT 绘图(一)

AWT 绘图

  • AWT 绘图
    • 一、Java 绘图基础
      • 1、Graphics 类
      • 2、Graphics2D 类
      • 3、Canvas 类
    • 二、绘制几何图形
    • 三、设置颜色和画笔
      • 1、设置颜色
      • 2、设置画笔
    • 四、绘制文本
      • 1、设置字体
      • 2、绘制文字

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:[email protected]
    
    
    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— AWT 绘图(一)_第1张图片

三、设置颜色和画笔

  • 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:[email protected]
    
    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 );
        }
    }
    
  • 效果如下:
    Java— AWT 绘图(一)_第2张图片

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:[email protected]
    
    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 );
        }
    }
    
  • 运行效果如下:
    Java— AWT 绘图(一)_第3张图片

四、绘制文本

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:[email protected]
    
    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 );
        }
    }
    
  • 运行效果如下:
    Java— AWT 绘图(一)_第4张图片

你可能感兴趣的:(Java,Java学习)