我用java创建了一个简单的绘画程序。我在使用擦除工具时遇到了问题。我不能允许用户只用白色油漆来擦除,因为我希望背景是图片。无论如何,每当用户用油漆绘制时,我都会尝试解决这个问题,试图让它将 Line2D 添加到数组列表中。然后,我希望用户在程序上画一条白线来显示正在擦除的内容。当白线进入图形时,我想得到一个结果。这是我的代码:
al = new ArrayList<Line2D>();
addMouseMotionListener(new MouseMotionAdapter(){
public void mouseDragged(MouseEvent e){
if(graphics2D != null && paint.erase==false)
{
currentX = e.getX();
currentY = e.getY();
graphics2D.setStroke(new BasicStroke(size));
graphics2D.drawLine(oldX, oldY, currentX, currentY);
repaint();
oldX = currentX;
oldY = currentY;
Line2D test=new Line2D.Float(oldX, oldY, currentX, currentY);
al.add(test);
//New system
}
if (paint.erase==true)
{
currentX = e.getX();
currentY = e.getY();
graphics2D.setStroke(new BasicStroke(size));
graphics2D.drawLine(oldX, oldY, currentX, currentY);
repaint();
for( Line2D name : PadDraw.al ) {
boolean result = Line2D.linesIntersect(oldX,oldY,currentX,currentY,name.getX1(),name.getY1(),name.getX2(),name.getY2());
if (result==true)
{
System.out.println("paint found");
}
}
oldX = currentX;
oldY = currentY;
}
}
});
这是一个非常灵活的解决方案,可能会起作用:
- 创建一个完全透明且大小与图片相同的
graphics
- 在其上绘制黑线以进行擦除
- 循环浏览图形。对于每个黑色像素,将图像中的像素复制到同一位置的
graphics
上。 - 将该图形渲染到原始图形上
您还可以使用它绘制擦除矩形、圆形等。但是,您不应该在每次鼠标移动时都使用它,因为它会花费太长时间。您可以暂时在这些斑点上绘制一些颜色来弥补这一点。