前面介绍了如何使用画笔在控件上展示图像,可是图像来源于磁盘图片,无法即兴绘制个性化的图案。所幸画笔工具Graphics不仅能够描绘图像,还支持绘制常见的几何形状,也支持绘制文本字符串,除了绘制图像用到的drawImage方法,Graphics还有下列常见的绘图方法:
setColor:设置画笔的颜色。
drawLine:在指定坐标的(x1,y1)与(x2,y2)两点之间画条线段。
drawRect:以坐标点(x,y)为左上角,绘制指定宽高的矩形边框。
fillRect:以坐标点(x,y)为左上角,绘制指定宽高的矩形区域。
drawRoundRect:以坐标点(x,y)为左上角,绘制指定宽高和指定圆角的圆角矩形边框。
fillRoundRect:以坐标点(x,y)为左上角,绘制指定宽高和指定圆角的圆角矩形区域。
drawOval:以坐标点(x,y)为外切矩形的左上角,绘制指定横纵半径的椭圆轮廓。注意,如果横纵半径的数值相等,此时椭圆就变成了圆形。
fillOval:以坐标点(x,y)为外切矩形的左上角,绘制指定横纵半径的椭圆区域。
drawArc:以坐标点(x,y)为外切矩形的左上角,绘制指定横纵半径和指定角度的圆弧。
fillArc:以坐标点(x,y)为外切矩形的左上角,绘制指定横纵半径和指定角度的扇形。
setFont:设置画笔的字体。
drawString:在当前位置的横纵偏移距离处绘制文本。

此外,Graphics也支持几种简单的管理操作,包括平移画笔、擦除区域、裁剪画布等功能,对应的处理方法说明如下:
translate:平移画笔至坐标点(x,y)。
clearRect:清除某块矩形区域,该矩形以坐标点(x,y)为左上角,且符合指定宽高。
clipRect:裁剪某块矩形区域,该矩形以坐标点(x,y)为左上角,且符合指定宽高。该方法的执行效果与clearRect正好相反,clearRect方法清除了矩形内部的所有图案;而clipRect方法清除了矩形外部的所有图案,只留下矩形内部的图案。

绘制图案与字符串的过程与绘制图像一样,都是重写自定义控件的paint方法,在该方法中调用画笔对象的各种绘图方法。接下来按照之前的图像视图依样画瓢定义一个绘画视图DrawView,变动之处在于绘制控件的paint方法,并据此演示几种图案的实现效果。首先准备绘制一条黑色线段,线段的起点位于控件的左上角,终点位于控件的右下角,则相应的绘制方法示例如下:

			g.setColor(Color.BLACK); // 设置画笔的颜色为黑色
// 在指定坐标的(x1,y1)与(x2,y2)两点之间画条线段
g.drawLine(0, 0, getWidth(), getHeight());

主界面的代码比较简单,有关绘画视图的调用可参考如下的代码片段:

		Panel panelCenter = new Panel(); // 创建中央面板
DrawView draw = new DrawView(); // 创建一个绘画视图
draw.setSize(360, 180); // 设置绘画视图的宽高
panelCenter.add(draw); // 在中央面板上添加绘画视图
frame.add(panelCenter, BorderLayout.CENTER); // 把中央面板添加到窗口的中间位置

运行修改后的测试代码,弹出的线段绘制窗口界面如下图所示。


接着绘制一个矩形边框,假设边框为红色,则对应的绘制方法如下所示:

			g.setColor(Color.RED); // 设置画笔的颜色为红色
// 以坐标点(x,y)为左上角,绘制指定宽高的矩形边框
g.drawRect(10, 10, getWidth() - 20, getHeight() - 20);

同样运行测试界面代码,弹出的矩形绘制窗口界面如下图所示。


再绘制一个绿色的圆角矩形,但它是实心的,此时绘制过程应当调用fillRoundRect方法:

			g.setColor(Color.GREEN); // 设置画笔的颜色为绿色
// 以坐标点(x,y)为左上角,绘制指定宽高和指定圆角的圆角矩形区域
g.fillRoundRect(10, 10, getWidth() - 20, getHeight() - 20, 50, 50);

运行主界面的测试代码,弹出的圆角矩形绘制窗口如下图所示。


继续绘制一个蓝色的椭圆轮廓,注意它是空心的,此时绘制过程应当调用drawOval方法:

			g.setColor(Color.BLUE); // 设置画笔的颜色为蓝色
// 以坐标点(x,y)为外切矩形的左上角,绘制指定横纵半径的椭圆轮廓
g.drawOval(10, 10, getWidth() - 20, getHeight() - 20);

运行主界面的测试代码,弹出的椭圆绘制窗口界面如下图所示。


还可以绘制一个橙色的扇形,所谓扇形是由某段圆弧连接两端的横纵半径组成,因此它相当于实心的圆弧,此时绘制过程应当调用dfillArc方法:

			g.setColor(Color.ORANGE); // 设置画笔的颜色为橙色
// 以坐标点(x,y)为外切矩形的左上角,绘制指定横纵半径和指定角度的扇形
g.fillArc(10, 10, getWidth() - 20, getHeight() - 20, 0, 90);

运行主界面的测试代码,弹出的扇形绘制窗口界面如下图所示。


最后使用画笔绘制几个文字,同时指定这段文字的颜色、字体以及大小,则对应的绘制方法如下所示:

			g.setColor(Color.BLACK); // 设置画笔的颜色为黑色
g.setFont(new Font("大号粗体", Font.BOLD, 50)); // 设置画笔的字体
g.drawString("春天花会开", 50, 50); // 在当前位置的横纵偏移距离处绘制文本

运行主界面的测试代码,弹出的文字绘制窗口界面如下图所示。


更多Java技术文章参见《Java开发笔记(序)章节目录

Java开发笔记(一百二十四)AWT绘图操作的更多相关文章

  1. Java开发笔记(二十四)方法的组成形式

    经过前面的学习,我们发现演示的Java代码越来越复杂,而且每个例子的代码都堆在入口方法main内部,这会导致如下问题:1.一个方法内部堆砌了太多的代码行,看着费神,维护起来也吃力:2.部分代码描述的是 ...

  2. Java开发笔记(八十四)文件与目录的管理

    程序除了处理内存中的数据结构,还要操作磁盘上的各类文件,这里的磁盘是个统称,泛指可以持久保留数据的存储介质,包括但不限于:插在软驱中的软盘.固定在机箱中的硬盘.插在光驱中的光盘.插在USB接口上的U盘 ...

  3. Java开发笔记(二十五)方法的输入参数

    前面通过main方法介绍了方法的定义形式,对于方法的输入参数来说,还有几个值得注意的地方,接下来分别对输入参数的几种用法进行阐述.一个方法可以有输入参数,也可以没有输入参数,倘若无需输入参数,则方法定 ...

  4. Java开发笔记(二十九)大整数BigInteger

    早期的编程语言为了节约计算机的内存,给数字变量定义了各种存储规格的数值类型,比如字节型byte只占用一个字节大小,短整型short占用两个字节大小,整型int占用四个字节大小,长整型long占用八个字 ...

  5. Java开发笔记(三十四)字符串的赋值及类型转换

    不管是基本的char字符型,还是包装字符类型Character,它们的每个变量只能存放一个字符,无法满足对一串字符的加工.为了能够直接操作一连串的字符,Java设计了专门的字符串类型String,该类 ...

  6. Java开发笔记(七十四)内存溢出的两种错误

    前面介绍的几种异常,其实都存在这样那样的逻辑问题,属于程序员的编码手误.还有一大类系统错误,表面上看不出什么问题,但是程序仍然运行不下去,兹举二例说明.第一个例子且看下列的测试代码: // 测试内存溢 ...

  7. Java开发笔记(二十六)方法的输出参数

    前面介绍了方法的输入参数,与输入参数相对应的则为输出参数,输出参数也被称作方法的返回值,意思是经过方法的处理最终得到的运算数值.这个返回值可能是整型数,也可能是双精度数,也可能是数组等其它类型,甚至允 ...

  8. Java开发笔记(二十八)布尔包装类型

    前面介绍了数值包装类型,因为不管是整数还是小数,它们的运算操作都是类似的,所以只要学会了Integer的用法,其它数值包装类型即可一并掌握.但是对于布尔类型boolean来说,该类型定义的是“true ...

  9. Java开发笔记(五十四)内部类和嵌套类

    通常情况下,一个Java代码文件只定义一个类,即使两个类是父类与子类的关系,也要把它们拆成两个代码文件分别定义.可是有些事物相互之间密切联系,又不同于父子类的继承关系,比如一棵树会开很多花朵,这些花儿 ...

  10. Java开发笔记(六十四)静态方法引用和实例方法引用

    前面介绍了方法引用的概念及其业务场景,虽然在所列举的案例之中方法引用确实好用,但是显而易见这些案例的适用场合非常狭窄,因为被引用的方法必须属于外层匿名方法(即Lambda表达式)的数据类型,像isEm ...

随机推荐

  1. WinDbg常用命令系列---?*

    ? (Command Help) 问号(?)字符显示所有命令和运算符的列表.问号本身显示命令帮助. 环境 模式 用户模式下,内核模式 目标 实时. 崩溃转储 平台 全部 0:000> ? Ope ...

  2. pgloader 方便的数据迁移工具

    pgloader 是一个支持多种数据源迁移到pg 数据库的工具,高性能,使用灵活同时作者 也提供了docker 版本的镜像,今年3月份使用此工具的时候,发现好久都没更新了,但是 最近作者有了新版本的发 ...

  3. dinoql 使用graphql 语法查询javascript objects

    dinoql 是一个不错的基于graphql 语法查询javascript objects 的工具包,包含以下特性 graphql 语法(很灵活) 安全的访问(当keys 不存在的时候,不会抛出运行时 ...

  4. tomcat 配置更改 web 目录

    tomcat 虚拟目录:( 编辑  tomcat/conf/server.xml ) <Host name="localhost" appBase="webapps ...

  5. Noip 2017 题目整理

    目录 2017Noip: 小凯的疑惑 时间复杂度 逛公园 奶酪 宝藏(50fen) 列队(QAQ不会,以后再研究吧) 2017Noip: 小凯的疑惑 题目描述 小凯手中有两种面值的金币,两种面值均为正 ...

  6. 漏斗分析(Funnel Analysis)

    什么是漏斗分析? 简单来讲,就是抽象出某个流程,观察流程中每一步的转化与流失. 漏斗的三个要素: 时间:特指漏斗的转化周期,即为完成每一层漏斗所需时间的集合 节点:每一层漏斗,就是一个节点 流量:就是 ...

  7. JDK源码解析---HashMap源码解析

    HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. HashMap是非线程安全的,只是 ...

  8. 38861cba61c66739c1452c3a71e39852.ttf net::ERR_ABORTED 404 (Not Found)

    error: http://localhost:63342/clappr-dev/js/38861cba61c66739c1452c3a71e39852.ttf net::ERR_ABORTED 40 ...

  9. avalon数据已更新,视图未更新的bug修复

    $computed: { pinlei() { var key = this.currentProduct.key || 'youpin'; console.log(key, "我是key& ...

  10. 【大数据】安装关系型数据库MySQL 安装大数据处理框架Hadoop

    作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3161 1.安装Mysql 使用命令  sudo apt-get ins ...