`

applet的简单流程图绘制小工具

阅读更多

使用说明如下:

1.在主区域的上面有一个写有"drawLine"的线形图标和几个图象图标,将鼠标移到图象图标上,光标变为手形,点击一下,取得需要绘制的图标

,然后移动到绘制区,右键鼠标就可以把选种的图标放置到相应位置;

2.当在主区域内放置的图标超过两个之后,点击工具栏上的drawLine线形图标,使之变色,然后分别点击主区域里的动态图标A和动态图标B,将会在A和B之间出现一条连线,根据顺序,先被点击的图标指向后被点击的图标,这里是A-->B,线段绘制完毕之后,线形图标恢复初始状态,必须再点击才能进行图标连线(注:一个图标可同时与多个图标连线);

3.把鼠标移动到主区域的动态图标上,光标变为移动形,点击鼠标,获取删除对象,按下键盘上的Delete键,就可以删除刚才选中的图标以及与它相连的所有线段。

4.在主区域双击鼠标右键,有子菜单可操作了。

 

注意事项:

1。必须把图片和该类放在同一目录下。否则,找不到图片了。

 

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.util.*;

public class applet7 extends Applet
{
	private static final long serialVersionUID = 1L;
	int count = 6; //装载的图片数量
	Vector v = new Vector(); //储存绘图信息
	Image[] img = new Image[count]; //把图片存入Image数组
	
	int myWidth = 0, myHeight = 0; //箭头起点坐标
	int widthcount = 0; //工具栏上图标之间隔
	
	boolean[] b = new boolean[count];
	int[] width = new int[count], height = new int[count], w = new int[count],
			h = new int[count], wid = new int[count], hei = new int[count], ww = new int[count], hh = new int[count];
	
	int startX = 0, startY = 0, endX = 0, endY = 0; //绘制图标间连线的起点和终点坐标
	Canvas startObj = null, endObj = null; //起点和终点动态图标
	String drawclear = ""; //是否绘制连线及指向箭头
	int clickX = 0, clickY = 0, moveX = 0, moveY = 0; //分别是点击和拖动动态图标时的坐标
	
	canvas[] can = null; //动态图标数组
	myCanvas[] mycan = new myCanvas[count]; //动态图标数组
	Canvas curcan = null; //当前获得焦点的图标
	Canvas curdelcan = null; //需要删除的当前图标
	Image curimg = null; //当前焦点图标的图象
	
	JPanel jp = new JPanel(null); //工具栏
	myCanvas drawLine = new myCanvas("drawLine"); //用工具栏图标类myCanvas的文字构造器构造的线型图标
	MediaTracker mt = new MediaTracker(this); //媒体对象,用于装载图象到内存

	
	PopupMenu popMenu2=new PopupMenu(); //右键菜单
	
	public void init()
	{
		img[0] = this.getImage(this.getCodeBase(), "1.gif"); //获取图象
		img[1] = this.getImage(this.getCodeBase(), "2.gif");
		img[2] = this.getImage(this.getCodeBase(), "1.jpg");
		img[3] = this.getImage(this.getCodeBase(), "2.jpg");
		img[4] = this.getImage(this.getCodeBase(), "3.jpg");
		img[5] = this.getImage(this.getCodeBase(), "4.jpg");
		
		this.resize(800, 600); //设置applet的尺寸,在浏览器里浏览根据html代码来设置
		this.setLayout(null); //设置布局管理器,因为要移动图标的位置,因此设置为null

		for (int i = 0; i < img.length; i++)
			mt.addImage(img[i], 0);

		try
		{
			mt.waitForAll();
		}
		catch (Exception ex)
		{
			System.err.println(ex.toString());
		}
		
		//----------------在主区域绘制工具栏--------------------------------
		this.add(jp); //添加工具栏
		jp.setBounds(0, 0, 800, 80); //放置工具栏
		jp.add(this.drawLine); //往工具栏上添加线型图标
		jp.setBackground(new Color(230, 230, 230)); //设置线形图标背景
		drawLine.setBounds(5, 5, 90, 30); //放置线形图标
		//----------------在主区域绘制工具栏------结束-----------------------
		
		
		//----------------显示工具条中的项-------------------------
		for (int i = 0; i < img.length; i++)
		{
			mycan[i] = new myCanvas(img[i]);
			width[i] = img[i].getWidth(this);
			height[i] = img[i].getHeight(this);
			jp.add(mycan[i]);
			mycan[i].setBounds(100 + 5 * (i + 1) + widthcount, 5, img[i]
					.getWidth(this), img[i].getHeight(this));
			widthcount += img[i].getWidth(this);
		}
		//----------------显示工具条中的项-----结束--------------------
		
		
		//---------------------右键子菜单项----------------------------------
		MenuItem menuItem1=new MenuItem("隐藏工具栏");
		MenuItem menuItem2=new MenuItem("显示工具栏");
		MenuItem menuItem3=new MenuItem("清空画面");
		
		popMenu2.add(menuItem1);
		popMenu2.add(menuItem2);
		popMenu2.add(menuItem3);
		add(popMenu2);
		
		
		
		menuItem1.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				jp.setVisible(false);  //隐藏工具条			
			}
		});
		
		menuItem2.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				jp.setVisible(true);
			}
		});
		
		menuItem3.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				//??????????????????
				repaint();   //?????
			}

			
		}
		);
		//---------------------右键子菜单项-------结束----------------------------
		
		
		//用于绘制图标之间的线段
		drawLine.addMouseListener(new MouseAdapter()
		{
			public void mousePressed(MouseEvent e)
			{
				clickdrawLine(e);				
			}
			
			
		});
		
		
		
		
		//---------------------鼠标监听事件-------------------------------------------
		this.addMouseListener(new MouseAdapter()
		{
			public void mouseClicked(MouseEvent e)  //用于放置动态图标
			{
				clickhere(e);
			}
			
			public void mouseReleased(MouseEvent e)
			{
				 if(e.getButton()==MouseEvent.BUTTON3 && e.getClickCount()==2)
				{
					 popMenu2.show(e.getComponent(),e.getX(),e.getY());  //显示右键菜单
				}	
				 
			}
		});
		//----------------------鼠标监听事件-----------结束-----------------------------
	}

	public void clickhere(MouseEvent e)
	{
		if(this.curcan == null)
			return;
		if(e.getModifiers() == MouseEvent.BUTTON3_MASK) //往绘图区添加动态图标,位置在鼠标点击时的坐标点
		{
			Canvas ca = new canvas(curimg);
			this.add(ca);
			ca.setBounds(e.getX(), e.getY(), curimg.getWidth(this), curimg.getHeight(this));
			this.validate();
			curcan=null;
		}
	}

	public void clickdrawLine(MouseEvent e)
	{
		if (drawLine.getBackground().equals(new Color(230, 230, 255))) //可以绘制线段
		{
			drawLine.setBackground(new Color(230, 230, 230));
			startObj = null;
			endObj = null;
			drawclear = "";
		}
		else //不可绘制线段
		{
			drawLine.setBackground(new Color(230, 230, 255));
			drawclear = "draw";
		}
	}

	public void paint(Graphics g)
	{
		//绘制线段
		for (int i = 0; i < v.size(); i++)
		{
			Vector v1 = (Vector) v.elementAt(i);
			startX = ((int[]) v1.elementAt(1))[0]
					+ ((int[]) v1.elementAt(1))[2] / 2;
			startY = ((int[]) v1.elementAt(1))[1]
					+ ((int[]) v1.elementAt(1))[3] / 2;
			endX = ((int[]) v1.elementAt(1))[4] + ((int[]) v1.elementAt(1))[6]
					/ 2;
			endY = ((int[]) v1.elementAt(1))[5] + ((int[]) v1.elementAt(1))[7]
					/ 2;
			g.drawLine(startX, startY, endX, endY);
			drawArrowhead(g, ((Canvas[]) v1.elementAt(0))[0], ((Canvas[]) v1
					.elementAt(0))[1]);
		}
	}

	//绘制箭头
	public void drawArrowhead(Graphics g, Canvas startObj, Canvas endObj)
	{
		double xx = 0, yy = 0, xx1 = 0, yy1 = 0, xx2 = 0, yy2 = 0;
		myWidth = myHeight = (int) Math.pow((double) (Math.pow(endObj
				.getWidth(), 2d) + Math.pow(endObj.getHeight(), 2d)), 1 / 2d) / 2;
		xx = endX
				- (endX - startX)
				* myWidth
				/ Math.pow((double) (endX - startX) * (endX - startX)
						+ (double) (endY - startY) * (endY - startY), 1 / 2d);
		yy = endY
				- (endY - startY)
				* myHeight
				/ (Math.pow((double) (endX - startX) * (endX - startX)
						+ (double) (endY - startY) * (endY - startY), 1 / 2d));
		xx1 = xx
				- 20
				* Math.cos(Math.atan(((double) yy - startY)
						/ ((double) xx - startX))
						- radians(30));
		yy1 = yy
				- 20
				* Math.sin(Math.atan(((double) yy - startY)
						/ ((double) xx - startX))
						- radians(30));
		xx2 = xx
				- 20
				* Math.sin(radians(60)
						- Math.atan(((double) (yy - startY))
								/ ((double) (xx - startX))));
		yy2 = yy
				- 20
				* Math.cos(radians(60)
						- Math.atan(((double) (yy - startY))
								/ ((double) (xx - startX))));
		if (startObj.getX() + startObj.getWidth() / 2 > endObj.getX()
				+ endObj.getWidth() / 2)
		{
			xx1 = xx
					+ 20
					* Math.cos(Math.atan(((double) yy - startY)
							/ ((double) xx - startX))
							- radians(30));
			yy1 = yy
					+ 20
					* Math.sin(Math.atan(((double) yy - startY)
							/ ((double) xx - startX))
							- radians(30));
			xx2 = xx
					+ 20
					* Math.sin(radians(60)
							- Math.atan(((double) (yy - startY))
									/ ((double) (xx - startX))));
			yy2 = yy
					+ 20
					* Math.cos(radians(60)
							- Math.atan(((double) (yy - startY))
									/ ((double) (xx - startX))));
		}
		g.fillPolygon(new int[] { (int) xx2, (int) xx1, (int) xx }, new int[] {
				(int) yy2, (int) yy1, (int) yy }, 3);
	}

	/**
	 * 该函数用于将角度转化为弧度
	 */
	public double radians(int degrees)
	{
		return ((double) degrees) * Math.PI / 180.0;
	}

	// ******************动态图标**************************
	class canvas extends Canvas
	{
		Image im = null;

		public canvas(Image im) //类体图形构造器
		{
			super();
			this.setCursor(new Cursor(Cursor.MOVE_CURSOR)); //设置鼠标悬浮样式,设立为移动形态
			this.im = im;
			
			//注册鼠标按下事件,用于获取需要绘制的图标对象
			this.addMouseListener(new MouseAdapter()
			{
				public void mousePressed(MouseEvent e)
				{
					clickcanvas(e);
				}
			});
			
			/**
			 * 动态图标键盘事件
			 */
			this.addKeyListener(new KeyAdapter()
			{
				public void keyPressed(KeyEvent e)
				{
					if (e.getKeyCode() == KeyEvent.VK_DELETE)
						removecanvas(e);
				}
			});

			/**
			 * 动态图标鼠标移动和拖动事件
			 */
			this.addMouseMotionListener(new MouseMotionAdapter()
			{
				public void mouseDragged(MouseEvent e)
				{
					movecanvas(e);
				}
			});
		}

		/**
		 * 在两个图标之间绘制线段的同时储存这两个图标以及线段的信息	
		 */
		public void movecanvas(MouseEvent e)
		{
			Canvas mcan = (Canvas) e.getSource();
			int mtop = mcan.getY(), mleft = mcan.getX(), mwidth = mcan
					.getWidth(), mheight = mcan.getHeight();
			mcan.setBounds(mleft + e.getX() - clickX, mtop + e.getY() - clickY,
					mwidth, mheight);

			for (int i = 0; i < v.size(); i++)
			{
				Vector v1 = (Vector) v.elementAt(i);
				if (((Canvas[]) v1.elementAt(0))[0].equals(mcan))
				{
					((int[]) v1.elementAt(1))[0] = mcan.getX();
					((int[]) v1.elementAt(1))[1] = mcan.getY();
					((int[]) v1.elementAt(1))[2] = mcan.getWidth();
					((int[]) v1.elementAt(1))[3] = mcan.getHeight();
				}
				else if (((Canvas[]) v1.elementAt(0))[1].equals(mcan))
				{
					((int[]) v1.elementAt(1))[4] = mcan.getX();
					((int[]) v1.elementAt(1))[5] = mcan.getY();
					((int[]) v1.elementAt(1))[6] = mcan.getWidth();
					((int[]) v1.elementAt(1))[7] = mcan.getHeight();
				}
			}

			((applet7) this.getParent()).repaint();
		}

		/**
		 * 删除图标以及相关连的线段
		 */
		public void removecanvas(KeyEvent e)
		{
			try
			{
				Canvas mcan = (Canvas) e.getSource();
				((applet7) this.getParent()).remove(curdelcan);
				for (int i = v.size() - 1; i >= 0; i--)
				{
					Vector v1 = (Vector) v.elementAt(i);
					if (((Canvas[]) v1.elementAt(0))[0].equals(mcan)
							|| ((Canvas[]) v1.elementAt(0))[1].equals(mcan))
						v.removeElementAt(i);
				}
				((applet7) this.getParent()).validate();
				((applet7) this.getParent()).repaint();
			}
			catch (NullPointerException ex)
			{
				return;
			}
		}

		/**
		 * 鼠标拖动图标是改变对象位置以及对象相关连线
		 */
		public void clickcanvas(MouseEvent e)
		{
			curdelcan = (Canvas) e.getSource();
			clickX = e.getX();
			clickY = e.getY();
			((applet7) this.getParent()).repaint();
			if (((applet7) this.getParent()).drawclear.equals(""))
				return;
			if (((applet7) this.getParent()).startObj == null
					&& ((applet7) this.getParent()).endObj == null)
				((applet7) this.getParent()).startObj = (Canvas) e.getSource();
			else if (((applet7) this.getParent()).startObj != null
					&& ((applet7) this.getParent()).endObj == null
					&& ((applet7) this.getParent()).startObj != (Canvas) e
							.getSource())
			{
				((applet7) this.getParent()).endObj = (Canvas) e.getSource();
				Vector v1 = new Vector();
				v1.addElement(new Canvas[] { startObj, endObj });
				v1.addElement(new int[] { startObj.getX(), startObj.getY(),
						startObj.getWidth(), startObj.getHeight(), endObj.getX

						(), endObj.getY(), endObj.getWidth(),
						endObj.getHeight() });
				v.addElement(v1);
				((applet7) this.getParent()).drawclear = "";
				((applet7) this.getParent()).drawLine.setBackground(null);
				((applet7) this.getParent()).startObj = null;
				((applet7) this.getParent()).endObj = null;
			}
		}

		/**
		 * 画出动态图标
		 */
		public void paint(Graphics g)
		{
			g.drawImage(im, 0, 0, this);
		}
	}

	// ***********************工具栏图标*****************************
	class myCanvas extends Canvas
	{		
		private static final long serialVersionUID = 1L;
		
		Image im = null;
		String str = "";

		/**
		 * 文字构造器
		 */
		public myCanvas(String s)
		{
			super();
			this.str = s;
		}

		/**
		 * 图象构造器
		 */
		public myCanvas(Image im)
		{
			super();
			this.setCursor(new Cursor(Cursor.HAND_CURSOR));  //设置鼠标悬浮时的样式,这里为手型
			this.im = im;
			this.addMouseListener(new MouseAdapter()
			{
				public void mousePressed(MouseEvent e)
				{
					clickmyCanvas(e);					
				}
			});
		}

		/**
		 * 每一个图标单击事件
		 */
		public void clickmyCanvas(MouseEvent e)
		{
			((applet7) this.getParent().getParent()).drawLine.setBackground(null); //恢复线形图标的默认背景
			((applet7) this.getParent().getParent()).drawclear = ""; //让线形图标初始化
			((applet7) this.getParent().getParent()).startObj = null; //初始化绘制线段的开始对象
			((applet7) this.getParent().getParent()).endObj = null; //初始化绘制线段的结束对象
			
			curcan = (Canvas) e.getSource(); //获取当前图标对象
			curimg = (Image) im; //获取当前图标对象的图象
		}

		public void paint(Graphics g)
		{
			if (str.equals(""))
			{
				g.drawImage(im, 0, 0, this); //画图,工具图标
			}	
			else
			{
				g.drawString(str, 20, getHeight() / 2); //文字,线型图标"drawline"
			}
		}
	}
}

 

 

 

分享到:
评论
1 楼 c581698 2010-10-15  
怎么不把图片放上来呢?

相关推荐

    Applet与图形、图像

    在Java中,Applet是用于创建网络应用的一个重要工具,尤其在早期互联网时代,它常用于创建交互式网页组件,如动画、游戏或图形展示。 在描述的实训内容中,我们有两个主要任务: 1. **在窗口中绘制小车模型**: ...

    java applet 挖宝小程序

    以上就是关于"java applet 挖宝小程序"的主要知识点,它展示了Java Applet开发的基本流程和关键技术。虽然Java Applet现在已经不再主流,但学习其中的编程思想和技术原理,对于理解现代Java GUI编程和游戏开发仍有...

    javaapplet

    3. **paint(Graphics g)**:绘制Applet的内容,接收一个Graphics对象用于绘图。 4. **destroy()**:Applet即将被移除时调用,释放资源。 5. **stop()**:Applet暂停运行,例如当浏览器窗口失去焦点时。 **四、...

    JavaApplet与JavaScript

    JavaApplet 的工作流程包括以下几个步骤: 1. 创建一个继承自 `java.applet.Applet` 的公共子类,子类名应与源程序文件名相同。 2. 编译该源代码文件生成 `.class` 文件。 3. 在 HTML 文件中添加 `&lt;applet&gt;` 标签,...

    Fireworks in applet

    Applet是Java的一种小程序,它可以在Web浏览器中运行,为网页提供交互性和动态内容。 1. **Java Applet**: Java Applet是早期Java技术的一部分,它允许开发者创建嵌入到HTML页面中的小型Java程序。用户在访问网页时...

    图片浏览小程序(java+applet).zip

    总的来说,这个“图片浏览小程序(java+applet)”项目是一个综合性的Java编程实践,涵盖了Java语言基础、Applet技术、图像处理以及基本的软件开发流程。通过学习和理解这个项目,开发者可以深入理解Java应用程序的...

    java applet的多媒体应用

    - **绘制流程图**:首先,设计程序的逻辑流程图,明确每个阶段的功能和操作顺序。 - **编写代码**:根据流程图,用Java语言实现Applet的各个组件和方法。这包括初始化(`init()`)、开始(`start()`)以及运行(`...

    基于Web的JGraphx自动绘制拓扑图的设计和实现.pdf

    JGraphx是一款开源的Java图形组件,具有高交互性和自动化,可以应用于表示图的结构中,如流程图、UML、交通线路、网络等等。在本文中,我们将使用JGraphx实现网络拓扑图的自动绘制。 在设计和实现中,我们首先使用...

    在Applet画面中实现y=a*x2+b*x+c 函数曲线的绘制

    - 程序流程图可以帮助可视化代码的执行步骤,主要代码应有注释以便理解。界面设计包括曲线、小人和颜色按钮的布局。 - 运行调试阶段,要确保程序无误,曲线绘制正确,小人能按预期路径运动,同时收集运行截图和...

    Java Applet版推箱子游戏.rar

    Applet是Java的一种小程序,它可以在Web浏览器中运行,为用户提供互动体验。本游戏包含了12个不同的关卡,每个关卡都需要玩家通过策略性的操作,将所有箱子移动到预设的目标位置,以完成关卡挑战。 游戏的核心机制...

    骑士巡游java+applet实现

    通过分析这些文件,我们可以理解整个骑士巡游的Java Applet实现流程,从加载资源、初始化棋盘、设置初始骑士位置,到运行算法寻找巡游路径并动态更新界面显示。这个项目不仅锻炼了编程技能,还展示了如何将理论知识...

    北大Java--Applet

    【北大Java--Applet】是北京大学Java课程的一部分,主要讲解如何使用Java语言编写在浏览器环境中运行的小应用程序,即Applet。Applet与普通的Java应用程序(Application)的主要区别在于执行方式。Application通过...

    关于项目中用到jgraph和applet的一点总结(1)

    `jGraph`的强大之处在于它的灵活性和易用性,开发者可以通过简单的代码就能实现复杂的图形绘制,同时支持各种图形操作,如拖放、缩放、旋转等。此外,`jGraph`还支持XML格式的数据交换,使得图形数据的存储和读取...

    Java Applet 入门

    Java Applet的执行流程包括以下步骤: 1. 浏览器加载HTML页面,遇到`&lt;applet&gt;`标签时,请求服务器下载Applet的.class文件。 2. 浏览器中的Java插件解析.class文件并创建Applet的实例。 3. JVM加载Applet类,并调用...

    推荐课程 完整版优质java教程 java精品教学课件 Java语言程序设计 第13章 applet程序(共20页).ppt

    5. **Applet示例**:简单的Applet程序通常覆盖`paint()`方法,通过`Graphics`对象来绘制文本、线条、矩形、椭圆等。例如,`SimpleApplet`展示了如何在applet窗口中显示文字,而`DrawingApplet`则演示了如何绘制图形...

    Java程序设计 5.1 图形编程之Applet.pptx

    例如,一个简单的"Hello World" Applet可以这样实现: ```java import java.awt.Graphics; import java.applet.Applet; public class HelloWorld extends Applet { String hw_text; public void init() { hw_...

    Java applet 入门

    Java applet是Java技术在早期Web...理解Java applet的工作原理和开发流程对于学习Java历史和技术演进具有重要意义。如今,开发者可以转向更现代的技术栈,如JavaScript和HTML5,以构建更加高效、安全的Web应用程序。

    完整版精品java课件 Java基础入门教程 Java程序设计 第12章 applet(共16页).ppt

    Java Applet是Java编程语言中的一种小程序,它可以在Web浏览器中运行,为用户提供交互式的体验。在本章中,我们将深入探讨Java Applet的基础知识,包括它的特点、运行原理、创建与执行流程,以及如何在网页中传递...

    毕设项目:基于BS结构下的OA流程可视化的研究与实现(Java+源代码+文档).zip

    1 引言 1 1.1 课题背景 1 1.2 技术可行性研究 1 1.2.1 Java Applet技术的可行性研究 1 1.2.2 XML技术的可行性研究 1 1.2.3 Microsoft Office Access...4.2.3 流程图保存和读取方法设计 17 4.2.4 节点间关系保存的实现 2

Global site tag (gtag.js) - Google Analytics