Java 用于循环绘制阵列中的图形[处理]

Java 用于循环绘制阵列中的图形[处理],java,arraylist,processing,pgraphics,Java,Arraylist,Processing,Pgraphics,我正在尝试使用处理构建一个绘图程序。我目前一直在使用pgraphics 当用户绘制矩形时,它显示正在绘制的形状。当用户释放鼠标时,它会创建最终形状的PGraphic。然后我想让用户在上面画。我的问题是: 在绘制矩形时,我必须重置画布的背景,否则,它会显示一系列矩形。结果是,当用户绘制一个新矩形时,旧矩形会消失,并在鼠标被释放后返回 一些想法: 我还想添加一些功能,用户可以在以前绘制的矩形上进行选择,并更改其颜色、笔划、发送到后面、带到前面等 为了实现这一点,我将所有绘制的矩形(PGraphics

我正在尝试使用处理构建一个绘图程序。我目前一直在使用
pgraphics

当用户绘制矩形时,它显示正在绘制的形状。当用户释放鼠标时,它会创建最终形状的
PGraphic
。然后我想让用户在上面画。我的问题是:

在绘制矩形时,我必须重置画布的背景,否则,它会显示一系列矩形。结果是,当用户绘制一个新矩形时,旧矩形会消失,并在鼠标被释放后返回

一些想法: 我还想添加一些功能,用户可以在以前绘制的矩形上进行选择,并更改其颜色、笔划、发送到后面、带到前面等

为了实现这一点,我将所有绘制的矩形(PGraphics)存储到
ArrayList
中,该列表将通过for循环绘制。这将允许我通过在
ArrayList
上下移动
PGraphics
元素来调整行为

PS:与其创建我自己的
Shape类
不如使用PShape

int startX;
int startY;
int endX;
int endY;
boolean drawing;
int strokeW = 3;
Shape shape;

PGraphics shapeLayer; 
ArrayList<PGraphics> layersList = new ArrayList();

void setup() {
  size(500, 500);
  cursor(CROSS);
  background(255);
  smooth();
}

void draw() {
  strokeWeight(strokeW);
  if (key >= '0' && key <= '9') {
    strokeW = key - '0';
  }
  for(int i = 0; i < layersList.size(); i++) {
    image(layersList.get(i), 0, 0);
  }
  if (drawing) {
    shape.createRectangle();
  }
}


void mousePressed() {
  startX = mouseX;
  startY = mouseY;

  shapeLayer = createGraphics(width, height);
  shapeLayer.beginDraw();
}  

void mouseDragged() {
  drawing = true;
  endX = constrain(mouseX, 0, 500);
  endY = constrain(mouseY, 0, 500); 

  shape = new Shape(startX, startY, endX, endY);
  shapeLayer.clear();
}

void mouseReleased() {
  drawing = false;
  shapeLayer.endDraw();
  layersList.add(shapeLayer);
}  

今后,请在发帖前尽量将问题缩小到a。例如,您可以将其硬编码为在用户拖动时绘制矩形,而不是包含每个形状的所有代码

但是你的问题是由于画到屏幕上而从不清除它造成的。你需要一个接一个的接近这些碎片

第1步:您能否创建一个草图,在拖动时只显示一个矩形,但当您放开鼠标时,该矩形是否消失了?从一个只做这一件事的基本草图开始,在进入下一步之前,让它完美地工作

第2步:您能将形状绘制到屏幕外缓冲区吗?看起来您已经在当前代码中尝试过这一点,但请注意,您从来没有在缓冲区中实际绘制过任何形状,也从来没有在屏幕上实际绘制过缓冲区。同样,从一个基本的草图开始。甚至不用担心用户输入或任何事情,只需将硬编码的矩形绘制到屏幕外缓冲区,然后将屏幕外缓冲区绘制到屏幕上即可

第3步:在绘制矩形时,能否将这两种方法结合起来显示矩形,然后在用户释放时将其绘制到屏幕外缓冲区

第4步:只有当矩形工作正常时,才能转到其他形状


编程就是这样工作的:你必须把你的问题分解成像这样的小步骤,然后你必须孤立地处理每一步。如果你被卡住了,你可以带着一个MCVE回来,只显示其中的一个步骤,我们将从那里开始。祝你好运。

除了凯文的答案之外:看起来你确实在使用另一个
PGraphics
缓冲区来绘制,但是整个草图可能更简单

除非需要撤消/重做模式(需要记住图形命令及其顺序),否则可以使用稍微简单一点的方法


你可以找到一个非常相似的展览。您只需添加铅笔和线条模式。

抱歉@kevin!我应该缩短我的代码和问题-我只是这么痛苦后,工作了几个小时,一事无成哈哈-我已经成功地实现了步骤1-2,除了我无法显示矩形时,绘制它。我可以得到矩形显示在屏幕外缓冲区一旦鼠标已经释放。顺便说一下,谢谢!
class Shape {
  int startX;
  int startY;
  int endX;
  int endY;

  Shape(int x1, int y1, int x2, int y2) {
    startX = x1;
    startY = y1;
    endX = x2;
    endY = y2;
  }    

  void createRectangle() {
    background(255, 0);
    shapeLayer.strokeWeight(strokeW);
    shapeLayer.rectMode(CORNERS);
    shapeLayer.rect(startX, startY, endX, endY);  
    rectMode(CORNERS);
    rect(startX, startY, endX, endY);

  }

}