这是一个可以画直线和椭圆的程序,前面的我都理解。但是在paint()方法中有些迷惑。就是既然已经把图形画了出来,为什么还要用一个VECTOR容器将所画的图形存起来再重新画出来?就是这部分
    v.add(new Line(start_X,start_Y,x,y));
  
        for(i=0;i<v.size();i++)
{
    Line l=(Line)v.elementAt(i);
if(shape.compareTo("line")==0)
              g.drawLine(l.getX1(),l.getY1(),l.getX2(),l.getY2());
else
  g.drawOval(l.getX1(),l.getY1(),l.getX2()-l.getX1(),l.getY2()-l.getY1());
}
    }部分代码如下:.......public class DrawApplet extends Applet implements MouseListener,MouseMotionListener
{
    private int x,y,start_X,start_Y,old_X,old_Y;
    private boolean draw;
    private Vector v;
    private int i;
    private String color,shape,bgcolor;    public void init()
    {
       
    addMouseListener(this);
        addMouseMotionListener(this);
        v=new Vector(1,1);
......   
     }
          . 
          . 
          .
          .
      ........        public void paint(Graphics g)
    {
if(!draw)
        {
            old_X=x;
            old_Y=y;
            draw=true;
        }
        else
        {
            g.setColor(getBackground());
if(shape.compareTo("line")==0)
              g.drawLine(start_X,start_Y,old_X,old_Y);
else
  g.drawOval(start_X,start_Y,old_X-start_X,old_Y-start_Y);
            v.removeElementAt(v.size()-1);
            old_X=x;
            old_Y=y;
        }
        
if(color.compareTo("red")==0)
  g.setColor(Color.red);
else if(color.compareTo("green")==0)
  g.setColor(Color.green);
else
  g.setColor(Color.blue);

        v.add(new Line(start_X,start_Y,x,y));
  
        for(i=0;i<v.size();i++)
{
    Line l=(Line)v.elementAt(i);
if(shape.compareTo("line")==0)
              g.drawLine(l.getX1(),l.getY1(),l.getX2(),l.getY2());
else
  g.drawOval(l.getX1(),l.getY1(),l.getX2()-l.getX1(),l.getY2()-l.getY1());
}
    }
}class Line
{
    private int x1,y1,x2,y2;
 
    public Line(int x1,int y1,int x2,int y2)
    {
        this.x1=x1;
        this.y1=y1;
        this.x2=x2;
        this.y2=y2;
    }    public int getX1() { return x1; }
    public int getY1() { return y1; }
    public int getX2() { return x2; }
    public int getY2() { return y2; }
}

解决方案 »

  1.   

    paint方法是用于重绘的。窗口被遮住后,遮住部分的图像就会丢失。当窗口再次显示出来时,就会发生重绘操作,这时paint就会被调用,需要用代码重新画出曾被遮盖的部分。就是这个作用。
      

  2.   

    有道理,但是还有一点小第不太明白,就是如果我只需要绘制一种图形(比如直线)就不需要用VECTOR对象将每个图形对象存起来,也就是说以上的那部分代码 ----
    v.add(new Line(start_X,start_Y,x,y));
      
            for(i=0;i<v.size();i++)
    {
        ..........    }就不需要了,图象也可以显示出来,这又是为什么呢?