001: package org.zilonis.tool.ui;
002:
003: import java.awt.BorderLayout;
004: import java.awt.Color;
005: import java.awt.GradientPaint;
006: import java.awt.Graphics;
007: import java.awt.Graphics2D;
008: import java.awt.Image;
009: import java.awt.LayoutManager;
010: import java.awt.Rectangle;
011: import java.awt.Shape;
012: import java.awt.event.ComponentEvent;
013: import java.awt.event.ComponentListener;
014: import java.awt.geom.Rectangle2D;
015: import java.awt.image.BufferedImage;
016:
017: import javax.swing.JPanel;
018:
019: public class GradientPanel extends JPanel {
020: protected BufferedImage gradientImage;
021: protected Color gradientStart = new Color(110, 110, 110);
022: protected Color gradientEnd = new Color(0, 0, 0);
023:
024: public GradientPanel() {
025: this (new BorderLayout());
026: }
027:
028: public GradientPanel(LayoutManager layout) {
029: super (layout);
030: addComponentListener(new GradientCacheManager());
031: }
032:
033: @Override
034: protected void paintComponent(Graphics g) {
035: createImageCache();
036:
037: if (gradientImage != null) {
038: Shape clip = g.getClip();
039: Rectangle bounds = clip.getBounds();
040:
041: Image backgroundImage = gradientImage.getSubimage(bounds.x,
042: bounds.y, bounds.width, bounds.height);
043: g.drawImage(backgroundImage, bounds.x, bounds.y, null);
044: }
045: }
046:
047: protected void createImageCache() {
048: int width = getWidth();
049: int height = getHeight();
050:
051: if (width == 0 || height == 0) {
052: return;
053: }
054:
055: if (gradientImage == null || width != gradientImage.getWidth()
056: || height != gradientImage.getHeight()) {
057:
058: gradientImage = new BufferedImage(width, height,
059: BufferedImage.TYPE_INT_RGB);
060:
061: Graphics2D g2 = gradientImage.createGraphics();
062: GradientPaint painter = new GradientPaint(0, 0,
063: gradientEnd, 0, height / 2, gradientStart);
064: g2.setPaint(painter);
065: Rectangle2D rect = new Rectangle2D.Double(0, 0, width,
066: height / 2.0);
067: g2.fill(rect);
068:
069: painter = new GradientPaint(0, height / 2, gradientStart,
070: 0, height, gradientEnd);
071: g2.setPaint(painter);
072: rect = new Rectangle2D.Double(0, (height / 2.0) - 1.0,
073: width, height);
074: g2.fill(rect);
075:
076: g2.dispose();
077: }
078: }
079:
080: private void disposeImageCache() {
081: synchronized (gradientImage) {
082: gradientImage.flush();
083: gradientImage = null;
084: }
085: }
086:
087: private class GradientCacheManager implements ComponentListener {
088: public void componentResized(ComponentEvent e) {
089: }
090:
091: public void componentMoved(ComponentEvent e) {
092: }
093:
094: public void componentShown(ComponentEvent e) {
095: }
096:
097: public void componentHidden(ComponentEvent e) {
098: disposeImageCache();
099: }
100:
101: }
102: }
|