Mega Code Archive

 
Categories / Java / 2D Graphics GUI
 

Round GradientPaint Fill demo

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;     }   }    }