У меня есть Brush
класс
final class Brush
{
private final int size;
private final Color color;
private final Ellipse2D.Double blob=new Ellipse2D.Double();
private Brush(int size,Color color)
{
this.size=size;
this.color=color;
}
void paint(Graphics2D g2d,Point location)
{
g2d.setColor(color);
blob.setFrame(location.x-(size/2.0),location.y-(size/2.0),size,size);//Translate ecllipse so that the centre of it's bounding box is exactly at the cursor location for more accurate blobs
g2d.fill(blob);
}
}
У меня есть Blob
класс, который отслеживает текущие настройки sh пользователя и где пользователь ранее перетаскивал свою мышь, чтобы запомнить чтобы нарисовать там каплю.
final class Blob
{
final Brush brush;
final Point location;
private Blob(Brush brush,Point location)
{
this.brush=brush;
this.location=location;
}
private void paint(Graphics2D g){brush.paint(g,location);}
}
Наконец, мой лог для рисования c, что очень просто.
Каждый раз, когда пользователь перетаскивает свою мышь, добавляйте каплю в это текущее место с текущим bru sh настройки и внутри paint()
l oop перебрать все капли и перерисовать их.
final class Painter extends Canvas
{
private Brush brush=new Brush(5,Color.red);//Can Change
private final ArrayList<Blob> blobs=new ArrayList();
private Painter(){addMouseMotionListener(new Dragger());}
@Override
public void paint(Graphics g)
{
super.paint(g);
blobs.forEach(blob->blob.paint(g));
}
private final class Dragger extends MouseAdapter
{
@Override
public void mouseDragged(MouseEvent m)
{
blobs.add(brush,m.getPoint());
repaint();
}
}
}
Проблема уже видна здесь. Размер списка растет в геометрической прогрессии, и мое приложение быстро тормозит. Есть ли более эффективный способ сделать это?