⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drawshapepanel.java

📁 自己写的一个Java画图板程序 支持鼠标拖动图形 选中图形 改变颜色等 推荐使用Eclipse来运行
💻 JAVA
字号:
package project;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.util.ArrayList;

import javax.swing.JPanel;

//绘图面板
public class DrawShapePanel extends JPanel
{
	
	private static final long serialVersionUID = 5224135628301543425L;

	ArrayList<Shape> shapeArrayList = new ArrayList<Shape>();
	
	ArrayList<Shape> preservedShapeArrayList = new ArrayList<Shape>();
	
	boolean isSelectToolOn = false;
	
	
	
	
	boolean isDrawLineOn = false;
	
	boolean isDrawRectangleOn = false;
	
	boolean isDrawOvalOn = false;
	
	boolean isBorderColorOn = false;
	
	boolean isFillColorOn = false;
	
	
	
	boolean isDone = false;
	
	
	boolean isMoving = false;
	
	boolean isSelecting = false;
	
	Point mouseOriginalPoint = new Point();
	
	Point mouseEndPoint = new Point();
	
	
	
	
	
	Color currentColor = Color.BLUE;
	
	
	//向当前图形链表shapeArrayList中加入图形
	public void addShape(Shape shape)
	{
		
		shapeArrayList.add(shape);
	}
	
	//重绘方法
	public void paintComponent(Graphics g)
	{
		
		
		super.paintComponent(g);
		
		//执行所有当前图形链表中的图形的draw方法
		for(Shape shape : shapeArrayList)
		{
			shape.draw(g);
			
		}
		
		
		

		
		
		
		//处于选择工具模式时
		if(isSelectToolOn)
		{
			
			
			int width = mouseOriginalPoint.x - mouseEndPoint.x;
			int widthAbs = Math.abs(width);
			
			int height = mouseOriginalPoint.y - mouseEndPoint.y;
			int heightAbs = Math.abs(height);
			
			
			//鼠标未放开且处于选择状态
			if(!isDone && isSelecting)
			{
				g.setColor(Color.BLACK);
				
				
				SuitableStartPoint suitableStartPoint =  new SuitableStartPoint();
				Point p = suitableStartPoint.getSuitableStartPoint(mouseOriginalPoint, mouseEndPoint);
				
				
				
				g.drawRect(p.x, p.y, widthAbs, heightAbs);
			
				
			}
			
			//鼠标已放开且处于选择状态
			else if(isDone && isSelecting)
			{
				
				
				
				for(Shape shape : shapeArrayList)
				{
					if(shape.isInMouseArea(mouseOriginalPoint, mouseEndPoint))
					{
						
						
						shape.setIsSelected(true);
						
						
						
						
						Graphics2D g2 = (Graphics2D)g;
						
						shape.highlight(g2);
						
						
					}
					
				}
			}
			
			
		}
		
		//处于画矩形模式时
		//鼠标未放开,绘制实时矩形
		else if(isDrawRectangleOn && !isDone)
		{
			g.setColor(Color.BLACK);
			
			
			SuitableStartPoint suitableStartPoint =  new SuitableStartPoint();
			Point p = suitableStartPoint.getSuitableStartPoint(mouseOriginalPoint, mouseEndPoint);
			
			
			int width = mouseOriginalPoint.x - mouseEndPoint.x;
			int widthAbs = Math.abs(width);
			
			int height = mouseOriginalPoint.y - mouseEndPoint.y;
			int heightAbs = Math.abs(height);
			
			
			
			g.drawRect(p.x, p.y, widthAbs, heightAbs);
		}
		
		//处于画直线模式时
		//鼠标未放开,绘制实时直线
		else if(isDrawLineOn && !isDone)
		{
			
			g.setColor(Color.BLACK);
			
			g.drawLine(mouseOriginalPoint.x, mouseOriginalPoint.y, mouseEndPoint.x, mouseEndPoint.y);
		}
		
		//处于画椭圆模式时
		//鼠标未放开,绘制实时椭圆
		else if(isDrawOvalOn && !isDone)
		{
			
			g.setColor(Color.BLACK);
			
			SuitableStartPoint suitableStartPoint =  new SuitableStartPoint();
			Point p = suitableStartPoint.getSuitableStartPoint(mouseOriginalPoint, mouseEndPoint);
			
			
			int width = mouseOriginalPoint.x - mouseEndPoint.x;
			int widthAbs = Math.abs(width);
			
			int height = mouseOriginalPoint.y - mouseEndPoint.y;
			int heightAbs = Math.abs(height);
			
			
			
			g.drawOval(p.x, p.y, widthAbs, heightAbs);
		}
		
		//处于边框颜色选择模式时,改变鼠标点击中的图形的边框颜色
		else if(isBorderColorOn)
		{
			SuitableStartPoint suitableStartPoint =  new SuitableStartPoint();
			Point p = suitableStartPoint.getSuitableStartPoint(mouseOriginalPoint, mouseEndPoint);
			
			
			
			for(Shape shape : shapeArrayList)
			{
				if(shape.isInShape(p.x, p.y))
				{
					shape.setBorderColor(currentColor);
					
					
				}
				
			}
			
			
		}
		
		//处于填充颜色选择模式时,改变鼠标点击中的图形的填充颜色
		else if(isFillColorOn)
		{
			SuitableStartPoint suitableStartPoint =  new SuitableStartPoint();
			Point p = suitableStartPoint.getSuitableStartPoint(mouseOriginalPoint, mouseEndPoint);
			
			
			
			for(Shape shape : shapeArrayList)
			{
				if(shape.isInShape(p.x, p.y))
				{
					shape.setFillColor(currentColor);
					
					
				}
				
			}
		}
		
		
	}
	
	
	//关闭所有模式
	//作为changeMode的辅助方法
	public void closeAllMode()
	{
		isSelectToolOn = false;
		
		
	
		isDrawLineOn = false;
		
		isDrawRectangleOn = false;
		
		isDrawOvalOn = false;
		
		isBorderColorOn = false;
		
		isFillColorOn = false;
		
		
		
		for(Shape shape : shapeArrayList)
		{
			shape.setIsSelected(false);
		}
		
		
		
	}
	
	//在模式间进行切换,不同的int值代表不同的模式
	public void changeMode(int mode)
	{
		switch(mode)
		{
		
		case 0: 
			closeAllMode();
			isSelectToolOn = true;
			break;
				
		case 1: 
			closeAllMode();
			isDrawLineOn = true;
		   	break;
		   		
		case 2: 
			closeAllMode();
			isDrawRectangleOn = true;
   			break;
   				
		case 3: 
			closeAllMode();
			isDrawOvalOn = true;
			break;
			
		case 4:
			closeAllMode();
			isBorderColorOn = true;
			break;
			
		case 5:
			closeAllMode();
			isFillColorOn = true;
			break;
			
			
		
		}
	}
	
	
	//将选中的图形进行组合
	
	//先将选中的图形加入到一个新的compositeShape中
	//然后将这些选中的图形移除
	//注意,调用shapeArrayList的remove方法的时候会改变shapeArrayList的状态,因此需要i--从而对i的值进行同步变化
	//最后把compositeShape加入到保存当前图形链表shapeArrayList中
	public void compositeShape()
	{
		CompositeShape compositeShape = new CompositeShape();
		
		
		
		for(int i = 0; i < shapeArrayList.size(); i++)
		{
			if((shapeArrayList.get(i)).getIsSelected())
			{
				
				compositeShape.addShape(shapeArrayList.get(i));
				shapeArrayList.remove(i);
				
				//i--必不可少,必须在remove之后让i回退一格,以免序号出错
				i--;
			
			}
			
		}
		
		
		shapeArrayList.add(compositeShape);
		
		
		
	}
	
	//将选中的图形进行分离
	
	//先对每一个compositeShape,把它保存的各个图形拿出来,加入到当前图形链表shapeArrayList中
	//然后把compositeShape从当前图形链表shapeArrayList中移除
	//同样注意这里要i--,使访问序号i随着shapeArrayList调用remove后元素位置变化而变化
	public void apartShape()
	{
		
		
		for(int i = 0; i < shapeArrayList.size(); i++)
		{
			if(((shapeArrayList.get(i)).getCompositeArrayList()) != null && (shapeArrayList.get(i)).getIsSelected() == true)
			{
				for(Shape shapeComposite : (shapeArrayList.get(i)).getCompositeArrayList())
				{
					shapeArrayList.add(shapeComposite);
				}
				
				
				
				shapeArrayList.remove(i);
				
				//i--同样必不可少
				i--;
			}
		}
	}
	
	
	

}
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -