7 绘图
很多程序如各种游戏都需要在窗口绘制各种图形,除此之外,即使在开发JavaEE项目时,有时候也必须“动态”的向客户端生成各种图形,图表,比如 图形验证码、统计图等,这都需要利用AWT的绘图功能。
7.1 组件绘图原理
之前我们已经学习了很多组件,例如Button、Frame、Checkbox等,不同的组件,展示出来的图形都不一样,其实这些组件展示出来的图形,其本质就是用AWT的绘图来完成的。
在AWT中,真正提供绘图功能的是Graphics对象,那么Component组件和Graphics对象存在什么关系,才能让Component绘制自身图形呢?
在Component类中,提供了下列三个方法来完成组件图形的绘制与刷新:
paint(Graphics g) | 绘制组件的外观 |
update(Graphics g) | 内部调用paint方法,刷新组件外观 |
repaint() | 调用update方法,刷新组件外观 |
组件绘制图形流程图:
一般情况下,update和paint方法是由AWT系统负责调用,如果程序要希望系统重新绘制组件,可以调用repaint方法完成。
7.2 Graphics对象的使用
AWT中提供了Canvas类充当画布,提供了Graphics类来充当画笔,通过调用Graphics对象的setColor()方法可以给画笔设置颜色。
画图的步骤:
1.自定义类,继承Canvas类,重写paint(Graphics g)方法完成画图;
2.在paint方法内部,真正开始画图之前调用Graphics对象的setColor(),setFont()等方法设置画笔颜色,字体等属性;
3.调用Graphics画笔的drawXxx()方法开始画图。
下面列出Graphics类中常用的一些方法:
setColor(Color c) | 颜色设置 |
setFont(Font font) | 字体设置 |
drawLine() | 绘制直线 |
drawRect() | 绘制矩形 |
drawRoundRect() | 绘制圆角矩形 |
drawOval() | 绘制椭圆形 |
drawPolygon() | 绘制多边形 |
drawArc() | 绘制圆弧 |
drawPolyline() | 绘制折线 |
fillRect() | 填充矩形区域 |
fillRoundRect() | 填充圆角矩形区域 |
fillOval() | 填充椭圆区域 |
fillPolygon() | 填充多边形区域 |
fillArc() | 填充圆弧对应的扇形区域 |
drawImage() | 绘制位图 |
案例:
使用AWT绘图API,完成下图效果:
演示代码:
-
public
class
SimpleDraw {
-
-
private
final String RECT_SHAPE=
"rect";
-
private
final String OVAL_SHAPE=
"oval";
-
-
private
Frame
frame
=
new
Frame(
"这里测试绘图");
-
-
Button
btnRect
=
new
Button(
"绘制矩形");
-
Button
btnOval
=
new
Button(
"绘制椭圆");
-
-
//定义一个变量,记录当前要绘制椭圆还是矩形
-
private
String
shape
=
"";
-
-
//自定义类,继承Canvas类,重写paint(Graphics g)方法完成画图;
-
private
class
MyCanvas
extends
Canvas{
-
@Override
-
public
void
paint
(Graphics g) {
-
//绘制不同的图形
-
-
if (shape.equals(RECT_SHAPE)){
-
//绘制矩形
-
g.setColor(Color.BLACK);
//设置当前画笔的颜色为黑色
-
g.drawRect(
100,
10,
150,
100);
-
-
}
else
if(shape.equals(OVAL_SHAPE)){
-
//绘制椭圆
-
g.setColor(Color.RED);
-
g.drawOval(
100,
10,
150,
100);
-
}
-
-
}
-
}
-
-
//创建自定义的画布对象
-
MyCanvas
drawArea
=
new
MyCanvas();
-
-
-
public
void
init
(){
-
//组装视图
-
btnRect.addActionListener(
new
ActionListener() {
-
@Override
-
public
void
actionPerformed
(ActionEvent e) {
-
//修改标记的值为rect
-
shape = RECT_SHAPE;
-
drawArea.repaint();
-
}
-
});
-
-
btnOval.addActionListener(
new
ActionListener() {
-
@Override
-