2D Graphics GUI Java

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.PaintContext;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.ColorModel;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class RoundGradientPaintFill extends JPanel{
  public void paint(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    RoundRectangle2D r = new RoundRectangle2D.Float(5, 5, 150, 150, 25,
        25);
    RoundGradientPaint rgp = new RoundGradientPaint(75, 75, Color.magenta,
        new Point2D.Double(0, 85), Color.blue);
    g2.setPaint(rgp);
    g2.fill(r);
  }
  public static void main(String[] args) {
    JFrame f = new JFrame();
    f.getContentPane().add(new RoundGradientPaintFill());
    f.setSize(200, 200);
    f.show();
  }
  class RoundGradientPaint implements Paint {
    protected Point2D point;
    protected Point2D mRadius;
    protected Color mPointColor, mBackgroundColor;
    public RoundGradientPaint(double x, double y, Color pointColor,
        Point2D radius, Color backgroundColor) {
      if (radius.distance(0, 0) <= 0)
        throw new IllegalArgumentException("Radius must be greater than 0.");
      point = new Point2D.Double(x, y);
      mPointColor = pointColor;
      mRadius = radius;
      mBackgroundColor = backgroundColor;
    }
    public PaintContext createContext(ColorModel cm, Rectangle deviceBounds,
        Rectangle2D userBounds, AffineTransform xform, RenderingHints hints) {
      Point2D transformedPoint = xform.transform(point, null);
      Point2D transformedRadius = xform.deltaTransform(mRadius, null);
      return new RoundGradientContext(transformedPoint, mPointColor,
          transformedRadius, mBackgroundColor);
    }
    public int getTransparency() {
      int a1 = mPointColor.getAlpha();
      int a2 = mBackgroundColor.getAlpha();
      return (((a1 & a2) == 0xff) ? OPAQUE : TRANSLUCENT);
    }
  }
  public class RoundGradientContext implements PaintContext {
    protected Point2D mPoint;
    protected Point2D mRadius;
    protected Color color1, color2;
    public RoundGradientContext(Point2D p, Color c1, Point2D r, Color c2) {
      mPoint = p;
      color1 = c1;
      mRadius = r;
      color2 = c2;
    }
    public void dispose() {
    }
    public ColorModel getColorModel() {
      return ColorModel.getRGBdefault();
    }
    public Raster getRaster(int x, int y, int w, int h) {
      WritableRaster raster = getColorModel().createCompatibleWritableRaster(
          w, h);
      int[] data = new int[w * h * 4];
      for (int j = 0; j < h; j++) {
        for (int i = 0; i < w; i++) {
          double distance = mPoint.distance(x + i, y + j);
          double radius = mRadius.distance(0, 0);
          double ratio = distance / radius;
          if (ratio > 1.0)
            ratio = 1.0;
          int base = (j * w + i) * 4;
          data[base + 0] = (int) (color1.getRed() + ratio
              * (color2.getRed() - color1.getRed()));
          data[base + 1] = (int) (color1.getGreen() + ratio
              * (color2.getGreen() - color1.getGreen()));
          data[base + 2] = (int) (color1.getBlue() + ratio
              * (color2.getBlue() - color1.getBlue()));
          data[base + 3] = (int) (color1.getAlpha() + ratio
              * (color2.getAlpha() - color1.getAlpha()));
        }
      }
      raster.setPixels(0, 0, w, h, data);
      return raster;
    }
  }
  
}