Java开发笔记(一百二十四)AWT绘图操作
前面介绍了如何使用画笔在控件上展示图像,可是图像来源于磁盘图片,无法即兴绘制个性化的图案。所幸画笔工具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绘图操作的更多相关文章
- Java开发笔记(二十四)方法的组成形式
经过前面的学习,我们发现演示的Java代码越来越复杂,而且每个例子的代码都堆在入口方法main内部,这会导致如下问题:1.一个方法内部堆砌了太多的代码行,看着费神,维护起来也吃力:2.部分代码描述的是 ...
- Java开发笔记(八十四)文件与目录的管理
程序除了处理内存中的数据结构,还要操作磁盘上的各类文件,这里的磁盘是个统称,泛指可以持久保留数据的存储介质,包括但不限于:插在软驱中的软盘.固定在机箱中的硬盘.插在光驱中的光盘.插在USB接口上的U盘 ...
- Java开发笔记(二十五)方法的输入参数
前面通过main方法介绍了方法的定义形式,对于方法的输入参数来说,还有几个值得注意的地方,接下来分别对输入参数的几种用法进行阐述.一个方法可以有输入参数,也可以没有输入参数,倘若无需输入参数,则方法定 ...
- Java开发笔记(二十九)大整数BigInteger
早期的编程语言为了节约计算机的内存,给数字变量定义了各种存储规格的数值类型,比如字节型byte只占用一个字节大小,短整型short占用两个字节大小,整型int占用四个字节大小,长整型long占用八个字 ...
- Java开发笔记(三十四)字符串的赋值及类型转换
不管是基本的char字符型,还是包装字符类型Character,它们的每个变量只能存放一个字符,无法满足对一串字符的加工.为了能够直接操作一连串的字符,Java设计了专门的字符串类型String,该类 ...
- Java开发笔记(七十四)内存溢出的两种错误
前面介绍的几种异常,其实都存在这样那样的逻辑问题,属于程序员的编码手误.还有一大类系统错误,表面上看不出什么问题,但是程序仍然运行不下去,兹举二例说明.第一个例子且看下列的测试代码: // 测试内存溢 ...
- Java开发笔记(二十六)方法的输出参数
前面介绍了方法的输入参数,与输入参数相对应的则为输出参数,输出参数也被称作方法的返回值,意思是经过方法的处理最终得到的运算数值.这个返回值可能是整型数,也可能是双精度数,也可能是数组等其它类型,甚至允 ...
- Java开发笔记(二十八)布尔包装类型
前面介绍了数值包装类型,因为不管是整数还是小数,它们的运算操作都是类似的,所以只要学会了Integer的用法,其它数值包装类型即可一并掌握.但是对于布尔类型boolean来说,该类型定义的是“true ...
- Java开发笔记(五十四)内部类和嵌套类
通常情况下,一个Java代码文件只定义一个类,即使两个类是父类与子类的关系,也要把它们拆成两个代码文件分别定义.可是有些事物相互之间密切联系,又不同于父子类的继承关系,比如一棵树会开很多花朵,这些花儿 ...
- Java开发笔记(六十四)静态方法引用和实例方法引用
前面介绍了方法引用的概念及其业务场景,虽然在所列举的案例之中方法引用确实好用,但是显而易见这些案例的适用场合非常狭窄,因为被引用的方法必须属于外层匿名方法(即Lambda表达式)的数据类型,像isEm ...
随机推荐
- Partition HDU - 4602 (不知道为什么被放在了FFT的题单里)
题目链接:Vjudge 传送门 相当于把nnn个点分隔为若干块,求所有方案中大小为kkk的块数量 我们把大小为kkk的块,即使在同一种分隔方案中的块 单独考虑,它可能出现的位置是在nnn个点的首.尾. ...
- [Go] Slices vs Array
It is recommended to use 'slice' over 'Array'. An array variable denotes the entire array; it is not ...
- [后端]gitlab之gitlab-ci自动部署
转发:https://www.jianshu.com/p/df433633816b 简介 gitlab-ci全称是gitlab continuous integration的意思,也就是持续集成.中心 ...
- CF1172E Nauuo and ODT LCT
自己独立想出来的,超级开心 一开始想的是对于每一个点分别算这个点对答案的贡献. 但是呢,我们发现由于每一条路径的贡献是该路径颜色种类数,而每个颜色可能出现多次,所以这样就特别不好算贡献. 那么,还是上 ...
- Python爬虫进阶 | 多线程
一.简介 为了提高爬虫程序效率,由于python解释器GIL,导致同一进程中即使有多个线程,实际上也只会有一个线程在运行,但通过request.get发送请求获取响应时有阻塞,所以采用了多线程依然可以 ...
- WinDbg常用命令系列---显示加载的模块列表lm
lm (List Loaded Modules) lm命令显示指定的加载模块.输出包括模块的状态和路径. lmOptions [a Address] [m Pattern | M Pattern] 参 ...
- javascript中的indexOf与if判断的装逼写法
常规indexOf与if判断写法: if("112233".indexOf("22")>-1) { console.log("很二") ...
- linux高性能服务器编程 (一) --Tcp/Ip协议族
前言: 在学习swoole入门基础的过程中,遇到了很多知识瓶颈,比方说多进程.多线程.以及进程池和线程池等都有诸多的疑惑.之前也有学习相关知识,但只是单纯的知识面了解.而没有真正的学习他们的来龙去脉. ...
- Redis常见问题及解决方案
在Redis的运维使用过程中你遇到过那些问题,又是如何解决的呢?本文收集了一些Redis的常见问题以及解决方案,与大家一同探讨. 码字不易,欢迎大家转载,烦请注明出处:谢谢配合 你的Redis有big ...
- Python3基础 yield StopIteration.value获取函数的返回值
Python : 3.7.3 OS : Ubuntu 18.04.2 LTS IDE : pycharm-community-2019.1.3 ...