Mega Code Archive

 
Categories / Java Tutorial / Swing
 

A JPanel with a textured background

/*  *  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);       }     }   } }