在Component类里提供了三个和绘图有关的方法:
(1)paint(Graphics g):绘制组件的外观。
(2)update(Graphics g):调用paint方法,刷新组件外观。
(3)repaint():调用update方法,刷新组件外观。
上面三个方法的调用关系为:repaint方法调用update方法;update方法调用paint方法。
Container类中的update方法先以组件的背景色填充整个组件区域,然后调用paint方法重画组件。Container类的update方法代码如下:
public void update(Graphics g)
{
if(isShowing())
{
if(!(peer instanceof LightweightPeer))
{
g.ClearRect(0,0,width,height);
}
paint(g);
}
}
普通组件的update方法则直接调用paint方法。
public void update(Graphics g)
{
paint(g);
}
paint和update方法通常用于被重写。通常情况下,程序通过重写paint方法实现在AWT组件上绘图。
重写update或paint方法时,该方法里包含了一个Graphics类型的参数,通过该Graphics参数就可以实现绘图功能。Graphics是一个抽象的画笔对象,Graphics可以在组件上绘制非富多彩的几何图形和位图Graphics类提供了如下几个方法用于绘制几何图形和位图:
drawLine:绘制直线。
drawString:绘制字符串。
drawRect:绘制矩形。
drawRoundRect:绘制圆角矩形。
drawOval:绘制椭圆形状。
drawPolygon:绘制多边形边框。
drawArc:绘制一段圆弧。
drawPolyline:绘制折线。
fillRect:填充一个矩形区域。
fillRoundRect:填充一个圆角矩形。 等等方法
下面的程序示范了一个简单的绘图程序:
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
public class SimpleDraw
{
private final String RECT_SHAPE="rect";
private final String OVAL_SHAPE="oval";
private Frame f=new Frame("简单绘图");
private Button rect=new Button("绘制矩形");
private Button oval=new Button("绘制椭圆");
private MyCanvas drawArea=new MyCanvas();
//用于保存需要绘制什么图形的字符串属性
private String shape="";
public void init()
{
Panel p=new Panel();
rect.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
//设置shape属性为RECT_SHAPE
shape=RECT_SHAPE;
//重画MyCanvas对象,即调用它的update方法
drawArea.repaint();
}
});
oval.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
//设置shape属性为OVAL_SHAPE
shape=OVAL_SHAPE;
//重画MyCanvas对象,即调用它的update方法
drawArea.repaint();
}
});
p.add(rect);
p.add(oval);
drawArea.setPreferredSize(new Dimension(250,150));
f.add(drawArea);
f.add(p,BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
}
public static void main(String[] args)
{
new SimpleDraw().init();
System.out.println("Hello World!");
}
class MyCanvas extends Canvas
{
public void paint(Graphics g)
{
Random rand=new Random();
if(shape.equals(RECT_SHAPE))
{
//设置画笔颜色
g.setColor(new Color(220,100,80));
//随机地绘制一个矩形框
g.drawRect(rand.nextInt(200),rand.nextInt(120),40,60);
}
if(shape.equals(OVAL_SHAPE))
{
//设置画笔颜色
g.setColor(new Color(80,100,200));
//随机地填充一个椭圆形
g.fillOval(rand.nextInt(200),rand.nextInt(120),50,40);
}
}
}
}
上面程序窗口中定义了两个按钮,当用户单击任意一个按钮时,程序调用了drawArea对象的repaint方法,该方法导致画布重绘(即调用drawArea对象的update方法,该方法将再调用paint方法)。