shapeapplet.java
来自「java的书上例子」· Java 代码 · 共 372 行
JAVA
372 行
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.applet.*;
import java.util.*;
/** 一个小应用程序用来制作Java 2D常用图形
* @作者:尉哲明
* @日期:2001年5月 */
public class ShapeApplet extends Applet implements ItemListener
{
private Choice comboBox;
private ShapeCanvas canvas;
/** init()方法:在Applet中放置一个下拉列表框和一块画布 */
public void init()
{
setLayout(new BorderLayout());
canvas=new ShapeCanvas();//创建一画布类对象用于在其上画图
add(canvas,"Center");
comboBox=new Choice();
comboBox.addItem("Line");
comboBox.addItem("Rectangle");
comboBox.addItem("RoundRectangle");
comboBox.addItem("Ellipse");
comboBox.addItem("Arc");
comboBox.addItem("Polygonr");
comboBox.addItem("QuadCurve");
comboBox.addItem("CubicCurve");
comboBox.addItemListener(this);
add(comboBox,"North");
}// init()方法结束
/** 下拉列表框事件处理方法 */
public void itemStateChanged(ItemEvent e)
{
ShapeMaker shapeMaker;
String s=comboBox.getSelectedItem();
if(s=="Line")
shapeMaker=(ShapeMaker)(new LineMaker());
else if(s=="Rectangle")
shapeMaker=(ShapeMaker)(new RectangleMaker());
else if(s=="RoundRectangle")
shapeMaker=(ShapeMaker)(new RoundRectangleMaker());
else if(s=="Ellipse")
shapeMaker=(ShapeMaker)(new EllipseMaker());
else if(s=="Arc")
shapeMaker=(ShapeMaker)(new ArcMaker());
else if(s=="Polygon")
shapeMaker=(ShapeMaker)(new PolygonMaker());
else if(s=="QuadCurve")
shapeMaker=(ShapeMaker)(new QuadCurveMaker());
else
shapeMaker=(ShapeMaker)(new CubicCurveMaker());
canvas.setShapeMaker(shapeMaker);//选择某一图形制作器后画出初始图形
}// itemStateChanged()方法结束
}
/** 画布类 */
class ShapeCanvas extends Canvas
{
private Point2D[] points;
private static Random generator=new Random();
private static int SIZE=10;
private int current;
private ShapeMaker shapeMaker;
/** 画布类构造方法:用来注册鼠标事件监听器 */
public ShapeCanvas()
{
addMouseListener(new MouseHandler());
addMouseMotionListener(new MouseMotionHandler());
current=-1;
}
/** 该方法画出初始图形 */
public void setShapeMaker(ShapeMaker aShapeMaker)
{
shapeMaker=aShapeMaker;
int n=shapeMaker.getPointCount();
points=new Point2D[n];
for(int i=0;i<n;i++)
{
double x=generator.nextDouble()*getWidth();
double y=generator.nextDouble()*getHeight();
points[i]=new Point2D.Double(x,y);
}
repaint();
}// setShapeMaker()方法结束
/** paint()方法 */
public void paint(Graphics g)
{
if(points==null) return;
Graphics2D g2=(Graphics2D)g;
for(int i=0;i<points.length;i++)
{
double x=points[i].getX()-SIZE/2;
double y=points[i].getY()-SIZE/2;
g2.fill(new Rectangle2D.Double(x,y,SIZE,SIZE));
}
g2.draw(shapeMaker.makeShape(points));
}// paint()方法结束
/** 该内部类用于处理鼠标事件 */
public class MouseHandler extends MouseAdapter
{
public void mousePressed(MouseEvent e)
{
Point p=e.getPoint();
for(int i=0;i<points.length;i++)
{
double x=points[i].getX()-SIZE/2;
double y=points[i].getY()-SIZE/2;
Rectangle2D r=new Rectangle2D.Double(x,y,SIZE,SIZE);
if(r.contains(p))
{
current=i;
return;
}
}
}// mousePressed()方法结束
public void mouseReleased(MouseEvent e)
{
current=-1;
}// mouseReleased()方法结束
}//内部类MouseHandler定义结束
/** 该内部类用于处理鼠标移动事件 */
public class MouseMotionHandler extends MouseMotionAdapter
{
public void mouseDragged(MouseEvent e)
{
if(current==-1) return;
points[current]=e.getPoint();
repaint();
}
} //内部类MouseMotionHandler定义结束
}// ShapeCanvas类定义结束
/** 该抽象类浓缩了图形制作器类的共同之处 */
abstract class ShapeMaker
{
private int pointCount;
/** 构造方法初始化控制点数 */
public ShapeMaker(int aPointCount)
{
pointCount=aPointCount;
}
/** 该方法得到控制点数 */
public int getPointCount()
{
return pointCount;
}
/** 该抽象方法利用所给控制点的当前位置计算出实际图形,该方法在paint()方法中被调用 */
public abstract Shape makeShape(Point2D[] p);
}// ShapeMaker类定义结束
/** 直线制作器类 */
class LineMaker extends ShapeMaker
{
/** 构造方法 */
public LineMaker()
{
super(2);
}
/** 重写父类的该方法 */
public Shape makeShape(Point2D[] p)
{
return new Line2D.Double(p[0],p[1]);
}
}// LineMaker类定义结束
/** 矩形制作器类 */
class RectangleMaker extends ShapeMaker
{
/** 构造方法 */
public RectangleMaker()
{
super(2);
}
/** 重写父类的该方法 */
public Shape makeShape(Point2D[] p)
{
Rectangle2D s=new Rectangle2D.Double();
s.setFrameFromDiagonal(p[0],p[1]);
return s;
}
} //RectangleMaker类定义结束
/** 圆角矩形制作器类 */
class RoundRectangleMaker extends ShapeMaker
{
/** 构造方法 */
public RoundRectangleMaker()
{
super(2);
}
/** 重写父类的该方法 */
public Shape makeShape(Point2D[] p)
{
RoundRectangle2D s=new RoundRectangle2D.Double(0,0,0,0,20,20);
s.setFrameFromDiagonal(p[0],p[1]);
return s;
}
}// RoundRectangleMaker类定义结束
/** 椭圆制作器类类 */
class EllipseMaker extends ShapeMaker
{
/** 构造方法 */
public EllipseMaker()
{
super(2);
}
/** 重写父类的该方法 */
public Shape makeShape(Point2D[] p)
{
Ellipse2D s=new Ellipse2D.Double();
s.setFrameFromDiagonal(p[0],p[1]);
return s;
}
} // EllipseMaker类定义结束
/** 圆弧制作器类 */
class ArcMaker extends ShapeMaker
{
/** 构造方法 */
public ArcMaker()
{
super(4);
}
/** 重写父类的该方法 */
public Shape makeShape(Point2D[] p)
{
double centerX=(p[0].getX()+p[1].getX())/2;
double centerY=(p[0].getY()+p[1].getY())/2;
double width=Math.abs(p[1].getX()-p[0].getX());
double height=Math.abs(p[1].getY()-p[0].getY());
double distortedStartAngle=
Math.toDegrees(Math.atan2(-(p[2].getY()-centerY)*width,
(p[2].getX()-centerX)*height));
double distortedEndAngle=
Math.toDegrees(Math.atan2(-(p[3].getY()-centerY)*width,
(p[3].getX()-centerX)*height));
double distortedAngleDifference=
distortedEndAngle-distortedStartAngle;
if(distortedStartAngle<0) distortedStartAngle+=360;
if(distortedAngleDifference<0) distortedAngleDifference+=360;
Arc2D s=new Arc2D.Double(0,0,0,0,distortedStartAngle,
distortedAngleDifference,Arc2D.OPEN);
s.setFrameFromDiagonal(p[0],p[1]);
GeneralPath g=new GeneralPath();
g.append(s,false);
Rectangle2D r=new Rectangle2D.Double();
r.setFrameFromDiagonal(p[0],p[1]);
g.append(r,false);
Point2D center=new Point2D.Double(centerX,centerY);
g.append(new Line2D.Double(center,p[2]),false);
g.append(new Line2D.Double(center,p[3]),false);
return g;
}
}// ArcMaker类定义结束
class PolygonMaker extends ShapeMaker //多边形制作器类
{
public PolygonMaker() //构造方法
{
super(6);
}
public Shape makeShape(Point2D[] p) //重写父类的该方法
{
GeneralPath s=new GeneralPath();
s.moveTo((float)p[0].getX(),(float)p[0].getY());
for(int i=1;i<p.length;i++)
s.lineTo((float)p[i].getX(),(float)p[i].getY());
s.closePath();
return s;
}
} // PolygonMaker类定义结束
/** 正方形曲线制作器类 */
class QuadCurveMaker extends ShapeMaker
{
/** 构造方法 */
public QuadCurveMaker()
{
super(3);
}
/** 重写父类的该方法 */
public Shape makeShape(Point2D[] p)
{
return new QuadCurve2D.Double(p[0].getX(),p[0].getY(),
p[1].getX(),p[1].getY(),p[2].getX(),p[2].getY());
}
} // QuadCurveMaker类定义结束
/** 立方体曲线制作器类 */
class CubicCurveMaker extends ShapeMaker
{
/** 构造方法 */
public CubicCurveMaker()
{
super(4);
}
/** 重写父类的该方法 */
public Shape makeShape(Point2D[] p)
{
return new CubicCurve2D.Double(
p[0].getX(),p[0].getY(),p[1].getX(),p[1].getY(),
p[2].getX(),p[2].getY(),p[3].getX(),p[3].getY());
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?