/** * @(#)StretchIcon.java 1.0 03/27/12 */ package com.wordpress.tipsforjava.swing; import java.awt.Component; import java.awt.Container; import java.awt.Graphics; import java.awt.Image; import java.awt.Insets; import java.awt.image.ImageObserver; import java.net.URL; import javax.swing.ImageIcon; /** * An Icon that scales its image to fill the component area, * excluding any border or insets, optionally maintaining the image's aspect * ratio by padding and centering the scaled image horizontally or vertically. *

* The class is a drop-in replacement for ImageIcon. *

* As the size of the Icon is determined by the size of the component in which * it is displayed, StretchIcon must only be used in conjunction * with a component and layout that does not depend on the size of the * component's Icon. * * @version 1.0 03/22/12 * @author Darryl */ public class StretchIcon extends ImageIcon { /** * Determines whether the aspect ratio of the image is maintained. Set to * false to distort the image to fill the component. */ protected boolean proportionate = true; /** * Creates a StretchIcon from an array of bytes. * * @param imageData * an array of pixels in an image format supported by the AWT * Toolkit, such as GIF, JPEG, or (as of 1.3) PNG * * @see ImageIcon#ImageIcon(byte[]) */ public StretchIcon(final byte[] imageData) { super(imageData); } /** * Creates a StretchIcon from an array of bytes with the * specified behavior. * * @param imageData * an array of pixels in an image format supported by the AWT * Toolkit, such as GIF, JPEG, or (as of 1.3) PNG * @param proportionate * true to retain the image's aspect ratio, * false to allow distortion of the image to fill * the component. * * @see ImageIcon#ImageIcon(byte[]) */ public StretchIcon(final byte[] imageData, final boolean proportionate) { super(imageData); this.proportionate = proportionate; } /** * Creates a StretchIcon from an array of bytes. * * @param imageData * an array of pixels in an image format supported by the AWT * Toolkit, such as GIF, JPEG, or (as of 1.3) PNG * @param description * a brief textual description of the image * * @see ImageIcon#ImageIcon(byte[], java.lang.String) */ public StretchIcon(final byte[] imageData, final String description) { super(imageData, description); } /** * Creates a StretchIcon from an array of bytes with the * specified behavior. * * @see ImageIcon#ImageIcon(byte[]) * @param imageData * an array of pixels in an image format supported by the AWT * Toolkit, such as GIF, JPEG, or (as of 1.3) PNG * @param description * a brief textual description of the image * @param proportionate * true to retain the image's aspect ratio, * false to allow distortion of the image to fill * the component. * * @see ImageIcon#ImageIcon(byte[], java.lang.String) */ public StretchIcon(final byte[] imageData, final String description, final boolean proportionate) { super(imageData, description); this.proportionate = proportionate; } /** * Creates a StretchIcon from the image. * * @param image * the image * * @see ImageIcon#ImageIcon(java.awt.Image) */ public StretchIcon(final Image image) { super(image); } /** * Creates a StretchIcon from the image with the specifiec behavior. * * @param image * the image * @param proportionate * true to retain the image's aspect ratio, * false to allow distortion of the image to fill * the component. * * @see ImageIcon#ImageIcon(java.awt.Image) */ public StretchIcon(final Image image, final boolean proportionate) { super(image); this.proportionate = proportionate; } /** * Creates a StretchIcon from the image. * * @param image * the image * @param description * a brief textual description of the image * * @see ImageIcon#ImageIcon(java.awt.Image, java.lang.String) */ public StretchIcon(final Image image, final String description) { super(image, description); } /** * Creates a StretchIcon from the image with the specified behavior. * * @param image * the image * @param description * a brief textual description of the image * @param proportionate * true to retain the image's aspect ratio, * false to allow distortion of the image to fill * the component. * * @see ImageIcon#ImageIcon(java.awt.Image, java.lang.String) */ public StretchIcon(final Image image, final String description, final boolean proportionate) { super(image, description); this.proportionate = proportionate; } /** * Creates a StretchIcon from the specified file. * * @param filename * a String specifying a filename or path * * @see ImageIcon#ImageIcon(java.lang.String) */ public StretchIcon(final String filename) { super(filename); } /** * Creates a StretchIcon from the specified file with the specified * behavior. * * @param filename * a String specifying a filename or path * @param proportionate * true to retain the image's aspect ratio, * false to allow distortion of the image to fill * the component. * * @see ImageIcon#ImageIcon(java.lang.String) */ public StretchIcon(final String filename, final boolean proportionate) { super(filename); this.proportionate = proportionate; } /** * Creates a StretchIcon from the specified file. * * @param filename * a String specifying a filename or path * @param description * a brief textual description of the image * * @see ImageIcon#ImageIcon(java.lang.String, java.lang.String) */ public StretchIcon(final String filename, final String description) { super(filename, description); } /** * Creates a StretchIcon from the specified file with the specified * behavior. * * @param filename * a String specifying a filename or path * @param description * a brief textual description of the image * @param proportionate * true to retain the image's aspect ratio, * false to allow distortion of the image to fill * the component. * * @see ImageIcon#ImageIcon(java.awt.Image, java.lang.String) */ public StretchIcon(final String filename, final String description, final boolean proportionate) { super(filename, description); this.proportionate = proportionate; } /** * Creates a StretchIcon from the specified URL. * * @param location * the URL for the image * * @see ImageIcon#ImageIcon(java.net.URL) */ public StretchIcon(final URL location) { super(location); } /** * Creates a StretchIcon from the specified URL with the specified behavior. * * @param location * the URL for the image * @param proportionate * true to retain the image's aspect ratio, * false to allow distortion of the image to fill * the component. * * @see ImageIcon#ImageIcon(java.net.URL) */ public StretchIcon(final URL location, final boolean proportionate) { super(location); this.proportionate = proportionate; } /** * Creates a StretchIcon from the specified URL. * * @param location * the URL for the image * @param description * a brief textual description of the image * * @see ImageIcon#ImageIcon(java.net.URL, java.lang.String) */ public StretchIcon(final URL location, final String description) { super(location, description); } /** * Creates a StretchIcon from the specified URL with the specified behavior. * * @param location * the URL for the image * @param description * a brief textual description of the image * @param proportionate * true to retain the image's aspect ratio, * false to allow distortion of the image to fill * the component. * * @see ImageIcon#ImageIcon(java.net.URL, java.lang.String) */ public StretchIcon(final URL location, final String description, final boolean proportionate) { super(location, description); this.proportionate = proportionate; } /** * Paints the icon. The image is reduced or magnified to fit the component * to which it is painted. *

* If the proportion has not been specified, or has been specified as * true, the aspect ratio of the image will be preserved by * padding and centering the image horizontally or vertically. Otherwise the * image may be distorted to fill the component it is painted to. *

* If this icon has no image observer,this method uses the c * component as the observer. * * @param c * the component to which the Icon is painted. This is used as * the observer if this icon has no image observer * @param g * the graphics context * @param x * not used. * @param y * not used. * * @see ImageIcon#paintIcon(java.awt.Component, java.awt.Graphics, int, int) */ @Override public synchronized void paintIcon(final Component c, final Graphics g, int x, int y) { if (this.getImage() == null) { return; } final Insets insets = ((Container) c).getInsets(); x = insets.left; y = insets.top; int w = c.getWidth() - x - insets.right; int h = c.getHeight() - y - insets.bottom; final Image image = this.getImage(); if (this.proportionate) { int iw = image.getWidth(c); int ih = image.getHeight(c); if ((iw * h) < (ih * w)) { iw = (h * iw) / ih; x += (w - iw) / 2; w = iw; } else { ih = (w * ih) / iw; y += (h - ih) / 2; h = ih; } } final ImageObserver io = this.getImageObserver(); g.drawImage(image, x, y, w, h, io == null ? c : io); } /** * Overridden to return 0. The size of this Icon is determined by the size * of the component. * * @return 0 */ @Override public int getIconWidth() { return 0; } /** * Overridden to return 0. The size of this Icon is determined by the size * of the component. * * @return 0 */ @Override public int getIconHeight() { return 0; } }