当前课程知识点:Java程序设计 > 第七章 图形用户界面 > 7.1-绘图 > 绘图
大家好
欢迎回来继续学习
JAVA语言程序设计
这一节我们来学习
与绘图相关的基本知识
在这一节我要给大家
简要的介绍一下
JAVA的绘图环境和图形对象
这要涉及到颜色和字体
还有这个抽象的Graphics类
以及Graphics的抽象子类
Grahics2D这两个类
首先我们来看一下
JAVA中的图形环境和图形对象
图形环境
我们先来看一下它的坐标
GUI组件它的左上角
默认为坐标的原点
然后从左上角到右下角
水平坐标X和垂直坐标Y
都是增加的
那坐标的单位是象素
如果我们需要在JAVA程序中绘图
比如说画一个矩形
画一个弧等等
如果需要绘制各种图形的话
就需要专门的图形环境
那怎么得到这个绘图的环境呢
我们需要绘图的程序
会接收到一个
叫做Graphics的引用
Graphics是JAVA里面的
一个抽象的类
我们并不能够去实现
一个Graphics的对象
但是Graphics类里面
规定了与平台无关的绘图接口
这样的话我们用这样的接口
编写的程序
就可以符合JAVA的要求
一处编写 各处执行了
那么真正的要在某一个平台上
去执行这个程序的时候
让程序真的绘图的时候
那肯定还得有一个
实现了Graphics类的子类对象
来为我们提供绘图环境了
实际上各个平台上
实现的这个JAVA系统
都会自动创建一个
Graphics类的非抽象的子类
这个非抽象的子类
实际上里面就包含着
与本地系统相关的
这个绘图环境
但是这个对于程序员来说
是透明的 我们感觉不到
我们感觉到的就是传来了一个
Graphics类型的引用给我们
然后我们就可以用它
来实现绘图
那什么时候这个绘图环境引用
会传过来呢
我们程序如果要实现
绘图的功能的话
肯定是要去执行
这个paint方法的
那么系统就会传一个
指向特定平台的
Graphics子类对象的
这么一个引用传过来
比如说这个引用名叫g
然后我们利用这个引用
就可以实现我们想实现的绘图了
要绘图的话
我们肯定就需要设置图形的颜色
那有关颜色的操作
都在color这个类里面
这个color
是在awt包里面的
这个表里列出了color类
以及Graphics类中
与颜色有关的方法
我们来看这里有几个常量
表示绿色 红色
还有我们来看
它这个构造方法里面
可以接收什么呢
接收指定的红绿蓝颜色的分量
像比如说getRed这个方法
它就会返回红色分量它的值
那像setColor
getColor方法
它不属于color类
但是也是与颜色相关的
它是Graphics
这个绘图类里面的两个方法
分别可以用来设置组件的颜色
或者取得图形组件的颜色
另外我们在程序中
也经常需要控制字体
那字体也专门有一个类
叫Font类
这个类它也是在awt包里面
那这个表中就列出了
字体Font类
以及这个Graphics类里面
与字体有关的方法
这里同样有几个常量
代表字体的不同风格
普通风格的
黑体字的 斜体字的
然后它的构造方法
可以利用指定的字体风格和大小
创建一个Font对象
还有这个getStyle
可以返回当前字体风格的整数值
isPlain测试一个字体
是否普通的字体风格
像getFont和setFont
它不是Font类里面的方法
它是这个图形环境类
Graphics类里面的方法
它可以用来获得当前的字体
设置这个字体为指定的某种字体
大家看看这个setFont
它的参数是一个Font对象
接下来我们就来了解一下
这个Graphics类
Graphics类
它可以用来绘制字符串
或者是各种的图形
也就是说在图形环境里面
我们写一个字符串
也可以像绘图一样
把它绘制出来
在这几页的这个表中
我简单的列了一下
Graphics类的常用方法
比如说绘制字符串
绘制一条线段 矩形
实心矩形等等
这里有常用的
各种图形的绘制方法
它们的参数在这个表里
有简要的说明
那么大家可以自己简单的
编个程序 用用试试
大致也就能了解它怎么用了
如果要详细的了解
每个方法的说明
希望大家去看API的文档
接下来我们就来看一个
绘图的例子
最终结果就是我们现在看见的
这个样子
希望在窗口里面
绘制各种各样的图形
填充不同的颜色
这个例题目标是
要在这样一个窗口中
绘制一些简单的图形
填充颜色
由于需要这么一个
本地应用程序主窗口
所以我们写的这个类
GraphicsTester
就需要继承JFrame
这样它就有主窗口了
然后在它的构造方法中
要首先调用它窗类的构造方法
传一个字符串过去
那么这个字符串
将来就会显示在
这个主窗口的标题栏里面
然后就是要显示窗口
设置窗口大小
接下来主要的绘图工作
都在这个paint方法中
我们看paint方法接收一个
Graphics引用作为参数
这个引用实际上
它是指向本地的JAVA系统
所产生的这个Graphics的
某个非抽象子类的对象
但是这些对于我们程序员来说
都是透明的 我们看不到
我们看到的就是说
这是一个Graphics引用
然后接下来第一件事情
一定要给它超类的paint方法
把这个引用传过去
然后就是我们来设置
字体颜色这些
然后设置完了以后
我们来看绘制一个字符串
drawString
就像画图一样
去画一个字符串出来
那么这个字符串
是显示在这了
我们是给它定位了坐标位置
还有颜色是蓝色
粗体12号字放在这了
那接下来我们再
另外设置一种字体和颜色
再写一个字符串
我们看到红色的字符串
在这显示出来了
在这两个字符串底下
我们给它准确的坐标位置
起点和终点
然后绘制一条直线
那么在这画了一条直线
注意前面我们用setcolor
把颜色设置成红色了
所以这条直线也就是红色
接下来我们每一次
绘制不同图形之前
先用setcolor
设置一个我们希望的颜色
然后去画这些图形
画了空心矩形 实心矩形
还有空心 实心的圆角矩形
还有有凸起效果的
这个空心的矩形
还有有凹陷效果的实心的矩形
以及这个椭圆 圆弧扇形
多边形等等这些
大家可以去尝试着
改改这些坐标参数
你看看这些图形
它的大小位置
是不是会有些变化
去尝试一下
好 那么这个是这个paint方法
然后我们来看在主方法中
我们就要构造一个
GraphicsTester对象
构造这么一个对象以后
然后接下来要设置一下
关闭窗口的默认操作
就是我们要点这个叉子的话
就窗口是要退出程序
关闭窗口 退出程序
好 那这样的话
我们启动这个程序以后
在这个构造方法中
就会设置让这个窗口可见
窗口可见
那么需要绘制窗口的时候
这个paint方法就会被自动调用
然后这些图就都画出来了
在刚才的例子中
我们看到了如何运用Graphics
去绘制一些简单的图形
以及填充颜色
那如果我们希望这个图
更炫一些 更漂亮一些
还有没有更好的东西
能给我们用呢 还有
接下来我们就来简单的看一下
还有一个JAVA2D这个API
能给我们提供些什么
JAVA2D API
分布在多个包里面
这里列了一下
它们所在的包中
那么使用这个JAVA2D API
我们可以很容易的
绘制各种形状
还可以控制笔画
比如笔画的粗细
线的端头的样式
比如说虚线
还可以用单色 渐变色
和纹理来填充形状
另外还可以对图形
进行平移 旋转 伸缩 切变
同时也可以对图形
进行模糊 锐化这些操作
还可以构建重叠的文本和图形
以及对形状进行剪切
把它限制在一个任意区域内等等
JAVA2D给我们提供了
很多很好的绘图功能
但是在我们的课中
没有那么多课时去详细介绍
只是在这简单给大家提一下
如果大家感兴趣
也是还要去参考
它的API文档
接下来我们就来了解一下
有一个类叫Graphics2D
它是Graphics类的子类
它也是一个抽象类
如果我们要使用
Graphics2D API的话
就要通过Graphics2D对象来用
像我们刚才说了
如果我们要画图的话
有一个Graphics引用
会被传递给paint方法
这样我们在paint方法里面
就可以用它绘图了
但是现在我们又说
需要用Graphics2D
来使用这个更好一些
更炫一些的绘图功能
那么能够这样做吗
实际上传给paint方法的
是Graphics类的子类
Graphics2D的
一个再下级的子类的实例
所以我们是可以把得到的
这个绘图对象的引用
转成Graphics2D类型的
比如说大家看这样
我们得到了一个绘图对象
比如说叫g
我们可以把这个引用
强制转换成Graphics2D的引用
因为它本身就是一个
Graphics2D的
再下级的非抽象子类的引用
好 下面我们就来看一个
用Graphics2D来绘图的例子
现在我们来看这个简单的
使用Graphics2D绘图的例子
在这个paint方法中
我们将这个参数引用
做强制类型转换
转换成Graphics2D类型的引用
然后我们就可以用
这个Graphics2D它的方法了
setPaint drawString
这个setPaint
就是设置了颜色的变化
从什么颜色开始
变到什么颜色
从红的变成黄的
起始坐标点 结束坐标点
这是设置了一个颜色的渐变
这个设置好了以后
我们再调用drawString
去画这个字符串出来
我们看到这个字符串的颜色
它是渐变的
这就是使用这个
Graphics2D绘图的思路
实际上就是把它
引用转换一下类型
然后更多的内容 更多的功能
大家可以去查这个API的文档
然后可以尝试着去使用
Graphics2D里面的
各种不同的绘图功能
好 在这一节
我们简单的了解了一下
JAVA的绘图环境
以及如何在JAVA程序中
绘制一些简单的图形
包括怎么样使用Graphics类
Graphics2D
还有一个管颜色的color类
一个管字体的Font类
只是给大家做了一点点简单介绍
但是我相信大家已经了解了
在JAVA里面
绘图的基本思路是什么
接下来我们还要给大家介绍
更多的图形用户界面的
组件这些内容
-1.0-导学
--1.0-导学
-1.1-Java与面向对象程序设计简介
--第一章 Java语言基础知识--1.1-Java与面向对象程序设计简介
-1.2-基本数据类型与表达式
-第一章 Java语言基础知识--1.2-基本数据类型与表达式
-1.3-数组
--1.3.1-数组
-第一章 Java语言基础知识--1.3-数组
-1.4-算法的流程控制
--第一章 Java语言基础知识--1.4-算法的流程控制
-1.5-第一章小结
-第一章编程练习题
-课件
--外部链接
-Java环境配置、Eclipse使用、Helloworld程序详解
--使用eclipse建立Java项目、编写和运行Java程序
-Java数据类型
--Java整数类型
--Java浮点类型
--数据类型实战
--数据类型转换
--Java强制类型转换精度损失示例与表达式中的数据类型转换
-Java数组
-Java变量
--Java的变量
-命令行参数
--命令行参数的介绍
-2.0-导学
--2.0-导学
-2.1-面向对象方法的特性
--第二章 类与对象--2.1-面向对象方法的特性
-2.2-1-类声明与对象创建
--第二章 类与对象--2.2-1-类声明与对象创建
-2.2-2-数据成员
--第二章 类与对象--2.2-2-数据成员
-2.2-3-方法成员
--第二章 类与对象--2.2-3-方法成员
-2.2-4-包
--2.2-4-包
--第二章 类与对象--2.2-4-包
-2.2-5-类的访问权限控制
--第二章 类与对象--2.2-5-类的访问权限控制
-2.3-1-对象初始化
--第二章 类与对象--2.3-1-对象初始化
-2.3-2-内存回收
--第二章 类与对象--2.3-2-内存回收
-2.4-枚举类
--2.4-枚举类
--第二章 类与对象--2.4-枚举类
-2.5-应用举例
--2.5-应用举例
-2.6-第2章小结
-第二章编程练习题
-课件
--第二章课件
-3.0-导学
--3.0-导学
-3.1.1-3.1.2-类继承的概念和语法
--第三章 类的重用--3.1.1-3.1.2-类继承的概念和语法
-3.1.3-隐藏和覆盖
--第三章 类的重用--3.1.3-隐藏和覆盖
-3.2-Object 类
--第三章 类的重用--3.2-Object 类
-3.3-终结类与终结方法
--第三章 类的重用--3.3-终结类与终结方法
-3.4-抽象类
--3.4-抽象类
--第三章 类的重用--3.4-抽象类
-3.5-泛型
--3.5-泛型
--第三章 类的重用--3.5-泛型
-3.6-类的组合
--3.6-类的组合
-3.7-小结
--3.7-小结
-第三章编程练习题
-课件
--课件
-4.0-导学
--导学
-4.1-接口
--接口
--第四章 接口与多态--4.1-接口
-4.2.1-4.2.2-类型转换
--类型转换
--第四章 接口与多态--4.2.1-4.2.2-类型转换
-4.2.3-方法的查找
--方法的查找
--第四章 接口与多态--4.2.3-方法的查找
-4.3-多态的概念
--多态的概念
--第四章 接口与多态--4.3-多态的概念
-4.4-多态的应用举例
--多态的应用举例
--第四章 接口与多态--4.4-多态的应用举例
-4.5-构造方法与多态性
--构造方法和多态性
--第四章 接口与多态--4.5-构造方法与多态性
-4.6-本章小结
--本章小结
-第四章编程作业
-课件
--课件
-5.0-导学
--5.0-导学
-5.1.1-5.1.2-异常处理的概念
--第五章 输入输出--5.1.1-5.1.2-异常处理的概念
-5.1.3-5.1.5-异常的处理
--第五章 输入输出--5.1.3-5.1.5-异常的处理
-5.2-输入输出流的概念
--输入输出流的概念
--第五章 输入输出--5.2-输入输出流的概念
-5.3.1-写文本文件
--写文本文件
--第五章 输入输出--5.3.1-写文本文件
-5.3.2-读文本文件
--读文本文件
--第五章 输入输出--5.3.2-读文本文件
-5.3.3-写二进制文件
--写二进制文件
--第五章 输入输出--5.3.3-写二进制文件
-5.3.4-读二进制文件
--读二进制文件
-5.3.5-File类
--File类
-5.3.6-处理压缩文件
--处理压缩文件
-5.3.7-对象序列化
--对象序列化
-5.3.8-随机文件读写
--随机文件读写
-5.4-本章小结
--本章小结
-课件
--课件
-6.0-导学
--导学
-6.1-Java集合框架介绍
--第六章 对象群体的组织--6.1-Java集合框架介绍
-6.2-主要接口及常用的实现类
--第六章 对象群体的组织--6.2-主要接口及常用的实现类
-6.3-常用算法
--常用算法
-6.4-数组实用方法
-6.5-基于动态数组的类型(Vector, ArrayList)
--基于动态数组的类型(Vector, ArrayList)
-6.6-遍历Collection
-6.7-Map接口及其实现
-6.8-第6章小结
--第6章小结
-课件
--课件
-7.0-导学
--导学
-7.1-绘图
--绘图
-7.2-Swing基础
--Swing基础
-7.3-Swing的层次
--Swing的层次
-7.4-布局管理
--布局管理
-7.5-内部类
--内部类
-7.6-事件处理的基本概念
-7.7-事件派发机制
--事件派发机制
-7.8-顶层容器
--7.8-顶层容器
-7.9-中间层容器(一)
-7.10-中间层容器(二)
-7.11-原子组件(一)
-7.12-原子组件(二)
-7.13-原子组件(三)
-7.14-其它Swing特性
-7.15-第7章小结
-课件
--课件