@Override
  public AffineTransform getTransform(Component componentArgument) {
    AffineTransform transform = AffineTransform.getScaleInstance(1.0, -1.0);
    transform.translate(0, -(componentArgument.getHeight() * 2));

    return transform;
  }
  @Override
  public void update() {
    graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, opacity));
    graphics.setColor(color);
    graphics.fillRect(0, 0, component.getWidth(), component.getHeight());

    component = null;
    graphics = null;
  }
  @Override
  public Graphics2D prepare(Component componentArgument, Graphics2D graphicsArgument) {
    this.component = componentArgument;
    this.graphics = graphicsArgument;

    int width = componentArgument.getWidth();
    int height = componentArgument.getHeight();

    componentImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    componentImageGraphics = componentImage.createGraphics();

    // Clear the image background
    componentImageGraphics.setComposite(AlphaComposite.Clear);
    componentImageGraphics.fillRect(0, 0, componentImage.getWidth(), componentImage.getHeight());

    componentImageGraphics.setComposite(AlphaComposite.SrcOver);

    return componentImageGraphics;
  }
 @Override
 public Bounds getBounds(Component componentArgument) {
   return new Bounds(0, 0, componentArgument.getWidth(), componentArgument.getHeight());
 }