FileDocCategorySizeDatePackage
ColorGradient.javaAPI DocExample2845Sat Jan 24 10:44:34 GMT 2004je3.graphics

ColorGradient.java

/*
 * Copyright (c) 2004 David Flanagan.  All rights reserved.
 * This code is from the book Java Examples in a Nutshell, 3nd Edition.
 * It is provided AS-IS, WITHOUT ANY WARRANTY either expressed or implied.
 * You may study, use, and modify it for any non-commercial purpose,
 * including teaching and use in open-source projects.
 * You may distribute it non-commercially as long as you retain this notice.
 * For a commercial use license, or to purchase the book, 
 * please visit http://www.davidflanagan.com/javaexamples3.
 */
package je3.graphics;
import java.applet.*;
import java.awt.*;

/** An applet that demonstrates the Color class */
public class ColorGradient extends Applet {
    Color startColor, endColor;   // Start and end color of the gradient
    Font bigFont;                 // A font we'll use

    /** 
     * Get the gradient start and end colors as applet parameter values, and
     * parse them using Color.decode().  If they are malformed, use white.
     **/
    public void init() {
	try {
	    startColor = Color.decode(getParameter("startColor"));
	    endColor = Color.decode(getParameter("endColor"));
	}
	catch (NumberFormatException e) {
	    startColor = endColor = Color.white;
	}
	bigFont = new Font("Helvetica", Font.BOLD, 72);
    }

    /** Draw the applet.  The interesting code is in fillGradient() below */
    public void paint(Graphics g) {
	fillGradient(this, g, startColor, endColor);  // display the gradient
	g.setFont(bigFont);                    // set a font
	g.setColor(new Color(100, 100, 200));  // light blue
	g.drawString("Colors!", 100, 100);     // draw something interesting
    }

    /**
     * Draw a color gradient from the top of the specified component to the
     * bottom.  Start with the start color and change smoothly to the end 
     **/
    public void fillGradient(Component c, Graphics g, Color start, Color end) {
	Rectangle bounds = this.getBounds();  // How big is the component?
	// Get the red, green, and blue components of the start and end
	// colors as floats between 0.0 and 1.0.  Note that the Color class
	// also works with int values between 0 and 255
	float r1 = start.getRed()/255.0f;
	float g1 = start.getGreen()/255.0f;
	float b1 = start.getBlue()/255.0f;
	float r2 = end.getRed()/255.0f;
	float g2 = end.getGreen()/255.0f;
	float b2 = end.getBlue()/255.0f;
	// Figure out how much each component should change at each y value
	float dr = (r2-r1)/bounds.height;
	float dg = (g2-g1)/bounds.height;
	float db = (b2-b1)/bounds.height;

	// Now loop once for each row of pixels in the component
	for(int y = 0; y < bounds.height; y++) {
	    g.setColor(new Color(r1, g1, b1));    // Set the color of the row
	    g.drawLine(0, y, bounds.width-1, y);  // Draw the row
	    r1 += dr; g1 += dg; b1 += db;         // Increment color components
	}
    }
}