在AWT中绘图

         在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方法,这两个方法都由AWT系统负责调用。通常在程序中没有出现repaint方法的定义,只有程序员对repaint()方法的显示调用(这点很奇怪),repaint()方法会导致AWT系统重新绘制该组件,而这个动作会触发组件的update方法,update又调用paint方法。所以update方法和paint方法都不是程序员去调用的,是系统调用的。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方法)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值