📄 drawshapepanel.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 + -