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 + -
显示快捷键?