import java.applet.Applet;
import java.util.*;
import java.awt.*;
public class DrawShapes extends Applet
implements MouseListener,MouseMotionListener
{
Vector shapeList;
Choice shapeChoice;
Choice colorChoice;
Choice fillChoice;
Point anchorPoint;
Shape s;
Dimension offScreenDimension;
Image offScreenImage;
Graphics offScreenGraphics;
public void init()
{
shapelist =new Vector(10);
anchorPoint =new Point(0,0);

shapeChoice=new Choice();//创建3个形状选择弹出式菜单
shapeChoice.addItem("Oval");
shapeChoice.addItem("Rectangle");
shapeChoice.addItem("RoundRect");
add(shapeChoice);

colorChoice=new Choice();
colorChoice.addItem("Red");
colorChoice.addItem("Yellow");
colorChoice.addItem("Blue");
add(colorChoice);

fillChoice=new Choice();
fillChoice.addItem("Filled");
fillChoice.addItem("Hollow");
add(fillChoice);
addMouseListener(this);
addMouseMotionListener(this);

}//end init()
pubic void mousePressed(MouseEvent Event)
{
String shapeString=shapeChoice.getSelectedItem();
String colorString=colorChoice.getSelectedItem();
String fillString=fillChoice.getSelectedItem();

if(fillString.equals("Hollow"))
{
if(shapeString.equals("Oval")){
s=new HollowOval();
}else if(shapeString.equals("Rectangle")){
s=new HollowRectangle();
}else
{
s=new HollowRoundRect();
}
}else
if(shapeString.equals("Oval")){
s=new FilledOval();
}else if(shapeString.equals("Rectangle"))
{
s=new FilledRectangle();
}else{
s=new FilledRoundRect();
}

}
//设置新形状的颜色
if(colorString.equals("Red"))
{
s.color=Color.red;;
}else if(colorString.equals("Yellow"))
{
s.color=Color.yellow;
}else
{
s.color=Color.blue;
}
//设形状的boundsBox为一个空的DragRect
s.boundsBox=new DragRect();
//将新形状追加到shapelist末尾
shapeList.addElement(s);
//但鼠标按下时(x,y)坐标作为anchor Point 坐标存起来
anchorPoint.x=Event.getX();
anchorPoint.y=Event.getY();

public void mouseMoved(MouseEvent Event){}
public void mouseClicked(MouseEvent Event){}
public void mouseEntered(MouseEvent Event){}
public void mouseExited(MouseEvent Event){}
//public void mousepressed(MouseEvent Event){}
//public void mouseReleased(MouseEvent Event){}

public void mouseDragged(MouseEvent Event)
{
//得到形状s的boundsBox矩形
DragRect dragRect=s.boundsBox;
dragRect.setBounds(
anchorPoint.x,anchorPoint.y,Event.getX()-anchorPoint.x,Event.getY()-anchorPoint.y);
dragRect.normalize();
repaint();
}
public void mouseReleased(MouseEvent Event)
{
repaint();
}
public void paint(Graphics g)
{
update(g);
}
public void update(Graphics g)
{
Dimension d=getSize();//得到applet绘图区域宽度喝高度尺寸
//在不存在离屏图形绘制环境或用户改变了applet绘制区域大小的情况下创建一个离屏环境
if((offScreenGraphics==null)||(d.width!=offScreenDimension.width)
||(d.height!=offScreenDimension.height))
{
offScreenDimension =d;
offScreedImage=createImage(d.width,d.height);
offScreedGraphics =offScreenImage.getGraphics();
}
//擦除前一个图像
offScreenGraphics.setColor(getBackground());
offScreenGraphics.fillRect(0,0,d.width,d.height);

//绘制区周围绘制一个凸起边界
offScreenGraphics.draw3DRect(5,30,d.width-11,d.height-31,true);
offScreenGraphics.draw3DRect(8,33,d.width-17,d.height-37,false);

//将形状链表中所有形状绘制到离屏图像中
int shapeCount=shapeList.size();
for(int i=0;i<shapeCount;i++)
{
s=(Shape)shapeList.elementAt(i);
s.draw(offScreenGraphics);
}
//将离屏图像绘制到applet上
g.drawImage(offScreenImage,0,0,this);

}//end of update() method


}//end of DrawShapes applet

class DragRect extends Rectangle
{
void normalize()
{
if(width<0)
{
x+=width;
width=-width;
}
if(height<0)
{
y+=height;
height=-height;
}
}
}
abstract class Shape
{
protected Color color;
protected DragRect boundsBox;
abstract void draw(Graphics g);

}
class HollowOval extends Shape
{
void draw(Graphics g)
{
g.setColor(Color.black);
g.drawOval(boundsBox.x,boundsBox.y,
boundsBox.width,boundsBox.height);
}
}
class HollowRectangle extends Shape
{
void draw(Graphics g)
{
g.setColor(Color.black);
g.drawOval(boundsBox.x,boundsBox.y,
boundsBox.width,boundsBox.height);
}
}    class HollowRoundRect extends Shape
{
void draw(Graphics g)
{
g.setColor(Color.black);
g.drawOval(boundsBox.x,boundsBox.y,
boundsBox.width,boundsBox.height,20,20);
}
}
class FilledOval extends Shape
{
void draw(Graphics g)
{
g.setColor(Color);
g.drawOval(boundsBox.x,boundsBox.y,
boundsBox.width,boundsBox.height);
super.draw(g);                     //调用父类的draw()在填色椭圆的周围绘制线圈

}
}
class FilledRectangle extends Shape
{
void draw(Graphics g)
{
g.setColor(Color);
g.drawOval(boundsBox.x,boundsBox.y,
boundsBox.width,boundsBox.height);
super.draw(g);                     //调用父类的draw()在填色椭圆的周围绘制线圈

}
}
class FilledRoundRect extends Shape
{
void draw(Graphics g)
{
g.setColor(Color);
g.drawOval(boundsBox.x,boundsBox.y,
boundsBox.width,boundsBox.height);
super.draw(g);                     //调用父类的draw()在填色椭圆的周围绘制线圈

}
}
可以喝我详细点说吗? 谢谢