PGraphics2D должен реализовать возможность клонирования, но выдает исключение

#java #processing #cloning

#java #обработка #клонирование

Вопрос:

Используя обработку Java, я пытаюсь создать глубокую копию объекта PGraphics2D

 PGraphics2D pg_render;
pg_render = (PGraphics2D) createGraphics(width, height, P2D);
PGraphics2D pg_postprocd = (PGraphics2D)pg_render.clone();
  

Который выдает исключение CloneNotSupportedException :

Необработанное исключение типа CloneNotSupportedException

Тем не менее, при чтении документа кажется, что клонирование реализовано.

Мне нужно иметь два экземпляра объектов PGraphics2D, чтобы я мог применять эффекты постобработки к одному и сохранять другой чистым для анализа векторов движения и тому подобного.

Ответ №1:

Исключение

PGraphics Класс сам по себе не реализует Clonable . Скорее, он расширяется PImage , и это класс, который фактически реализует Cloneable интерфейс.

Вот почему ваш вызов pg_render.clone() throws CloneNotSupportedException , поскольку PGraphics фактически не поддерживает клонирование (но, случается, расширяет класс, который это делает).

Решение

Приведенный ниже статический метод возвращает клон входного объекта PGraphics. Он создает новый PGraphics объект createGraphics() , клонирует стиль (стиль включает такие вещи, как текущий цвет заливки) и, наконец, клонирует пиксельный буфер.

Код

 static PGraphics clonePGraphics(PGraphics source) {

  final String renderer;
  switch (source.parent.sketchRenderer()) {
    case "processing.opengl.PGraphics2D" :
      renderer = PConstants.P2D;
      break;
    case "processing.opengl.PGraphics3D" :
      renderer = PConstants.P3D;
      break;
    default : // secondary sketches cannot use FX2D
      renderer = PConstants.JAVA2D;
  }

  PGraphics clone = source.parent.createGraphics(source.width, source.height, renderer);
  
  clone.beginDraw();
  clone.style(source.getStyle()); // copy style (fillColor, etc.)
  source.loadPixels(); // graphics buffer -> int[] buffer
  clone.pixels = source.pixels.clone(); // in's int[] buffer -> clone's int[] buffer
  clone.updatePixels(); // int[] buffer -> graphics buffer
  clone.endDraw();
  
  return clone;
}