TexturedPanel.java Source code

Java tutorial

Introduction

Here is the source code for TexturedPanel.java

Source

/*
 *  TexturedPanel.java
 *  2006-11-02
 */

//cb.aloe.decor;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Paint;
import java.awt.Rectangle;
import java.awt.TexturePaint;
import java.awt.image.BufferedImage;

import javax.swing.Icon;
import javax.swing.JPanel;

/**
 * A JPanel with a textured background.
 * 
 * @author Christopher Bach
 */
public class TexturedPanel extends JPanel {

    private TexturePaint ourPainter = null;

    private Color ourDefaultForeground = Color.white;

    private Color ourDefaultBackground = Color.gray;

    /**
     * Creates a new TexturedPanel with a simple striped pattern.
     */
    public TexturedPanel() {
        super();
        ourDefaultForeground = Color.white;
        ourDefaultBackground = getBackground();
        setupDefaultPainter(ourDefaultForeground, ourDefaultBackground);
    }

    /**
     * Creates a new TexturedPanel with a simple striped pattern consisting of the
     * given foreground and background colors.
     */
    public TexturedPanel(Color foreground, Color background) {
        super();
        ourDefaultForeground = (foreground != null ? foreground : Color.white);
        ourDefaultBackground = (background != null ? background : getBackground());

        setupDefaultPainter(ourDefaultForeground, ourDefaultBackground);
    }

    /**
     * Creates a new TexturedPanel with a simple pattern based on the provided
     * texture map and consisting of the given foreground and background colors.
     */
    public TexturedPanel(Color foreground, Color background, boolean[][] texture) {
        super();
        ourDefaultForeground = (foreground != null ? foreground : Color.white);
        ourDefaultBackground = (background != null ? background : getBackground());

        setupTexturePainter(ourDefaultForeground, ourDefaultBackground, texture, 1);
    }

    /**
     * Creates a new TexturedPanel with a simple pattern based on the provided
     * texture map and consisting of the given foreground and background colors.
     */
    public TexturedPanel(Color foreground, Color background, boolean[][] texture, int scale) {
        super();
        ourDefaultForeground = (foreground != null ? foreground : Color.white);
        ourDefaultBackground = (background != null ? background : getBackground());

        setupTexturePainter(ourDefaultForeground, ourDefaultBackground, texture, scale);
    }

    /**
     * Creates a new TexturedPanel that tiles the provided image.
     */
    public TexturedPanel(Image texture) {
        super();
        ourDefaultForeground = Color.white;
        ourDefaultBackground = getBackground();

        if (texture != null)
            setupImagePainter(texture);
        else
            setupDefaultPainter(ourDefaultForeground, ourDefaultBackground);
    }

    /**
     * Creates a new TexturedPanel that tiles the provided icon.
     */
    public TexturedPanel(Icon textureIcon) {
        super();
        ourDefaultForeground = Color.white;
        ourDefaultBackground = getBackground();

        if (textureIcon != null) {
            setupIconPainter(textureIcon);
        }

        else
            setupDefaultPainter(ourDefaultForeground, ourDefaultBackground);
    }

    /**
     * Sets up this TexturedPanel to paint a simple background based on the
     * provided texture and consisting of the provided colors.
     */
    public void setTexture(Color foreground, Color background, boolean[][] texture) {
        if (foreground != null && background != null && texture != null && texture.length > 0
                && texture[0].length > 0) {
            setupTexturePainter(foreground, background, texture, 1);
        }
    }

    /**
     * 
     */
    public void setTexture(Color foreground, Color background, boolean[][] texture, int scale) {
        setupTexturePainter(foreground, background, texture, scale);
    }

    /**
     * Sets up this TexturedPanel to paint a striped background consisting of the
     * provided colors.
     */
    public void setTextureColors(Color foreground, Color background) {
        if (foreground != null && background != null) {
            ourDefaultForeground = foreground;
            ourDefaultBackground = background;
            setupDefaultPainter(foreground, background);
        }
    }

    /**
     * Sets up this TexturedPanel to paint a tiled background consisting of the
     * provided image. If the image is null, the background will revert to a
     * striped texture consisting of the last known colors.
     */
    public void setTextureImage(Image texture) {
        if (texture != null)
            setupImagePainter(texture);
        else
            setupDefaultPainter(ourDefaultForeground, ourDefaultBackground);
    }

    /**
     * Sets up this TexturedPanel to paint a tiled background consisting of the
     * provided icon. If the icon is null, the background will revert to a striped
     * texture consisting of the last known colors.
     */
    public void setTextureIcon(Icon textureIcon) {
        if (textureIcon != null) {
            setupIconPainter(textureIcon);
        }

        else
            setupDefaultPainter(ourDefaultForeground, ourDefaultBackground);
    }

    /**
     * Returns the image buffer used by this TexturedPanel's painter.
     */
    public Image getTexture() {
        if (ourPainter == null)
            return null;
        else
            return ourPainter.getImage();
    }

    /**
     * Creates a new TexturePaint using the provided colors.
     */
    private void setupDefaultPainter(Color foreground, Color background) {
        if (foreground == null || background == null) {
            ourPainter = null;
            return;
        }

        BufferedImage buff = new BufferedImage(6, 6, BufferedImage.TYPE_INT_ARGB_PRE);

        Graphics2D g2 = buff.createGraphics();

        g2.setColor(background);
        g2.fillRect(0, 0, 6, 6);

        g2.setColor(foreground);
        g2.drawLine(0, 2, 6, 2);
        g2.drawLine(0, 5, 6, 5);

        ourPainter = new TexturePaint(buff, new Rectangle(0, 0, 6, 6));

        g2.dispose();
    }

    /**
     * Creates a new TexturePaint using the provided colors and texture map.
     */
    private void setupTexturePainter(Color foreground, Color background, boolean[][] texture, int scale) {
        if (texture == null || texture.length < 1 || texture[0].length < 1) {
            setupDefaultPainter(foreground, background);
            return;
        }

        else if (foreground == null || background == null) {
            ourPainter = null;
            return;
        }

        scale = Math.max(1, scale);
        int w = texture[0].length;
        int h = texture.length;

        BufferedImage buff = new BufferedImage(w * scale, h * scale, BufferedImage.TYPE_INT_ARGB_PRE);

        Graphics2D g2 = buff.createGraphics();

        g2.setColor(background);
        g2.fillRect(0, 0, w * scale, h * scale);

        g2.setColor(foreground);
        for (int i = 0; i < h; i++) {
            for (int j = 0; j < w; j++) {
                try {
                    if (texture[i][j])
                        g2.fillRect(j * scale, i * scale, scale, scale);
                }
                // g2.drawLine(j, i, j, i); }
                catch (ArrayIndexOutOfBoundsException aob) {
                }
            }
        }

        ourPainter = new TexturePaint(buff, new Rectangle(0, 0, w * scale, h * scale));

        g2.dispose();
    }

    /**
     * Creates a new TexturePaint using the provided image.
     */
    private void setupImagePainter(Image texture) {
        if (texture == null) {
            ourPainter = null;
            return;
        }

        int w = texture.getWidth(this);
        int h = texture.getHeight(this);

        if (w <= 0 || h <= 0) {
            ourPainter = null;
            return;
        }

        BufferedImage buff = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB_PRE);

        Graphics2D g2 = buff.createGraphics();
        g2.drawImage(texture, 0, 0, this);
        ourPainter = new TexturePaint(buff, new Rectangle(0, 0, w, h));

        g2.dispose();
    }

    /**
     * Creates a new TexturePaint using the provided icon.
     */
    private void setupIconPainter(Icon texture) {
        if (texture == null) {
            ourPainter = null;
            return;
        }

        int w = texture.getIconWidth();
        int h = texture.getIconHeight();

        if (w <= 0 || h <= 0) {
            ourPainter = null;
            return;
        }

        BufferedImage buff = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB_PRE);

        Graphics2D g2 = buff.createGraphics();
        texture.paintIcon(this, g2, 0, 0);
        ourPainter = new TexturePaint(buff, new Rectangle(0, 0, w, h));

        g2.dispose();
    }

    /**
     * Paints this component with its textured background.
     */
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        if (ourPainter != null) {
            int w = getWidth();
            int h = getHeight();
            Insets in = getInsets();

            int x = in.left;
            int y = in.top;
            w = w - in.left - in.right;
            h = h - in.top - in.bottom;

            if (w >= 0 && h >= 0) {
                Graphics2D g2 = (Graphics2D) g;
                Paint pt = g2.getPaint();
                g2.setPaint(ourPainter);
                g2.fillRect(x, y, w, h);
                g2.setPaint(pt);
            }
        }
    }

}