001 /* 002 * $Id: PaintUtils.java,v 1.8 2006/05/14 15:55:54 dmouse Exp $ 003 * 004 * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle, 005 * Santa Clara, California 95054, U.S.A. All rights reserved. 006 * 007 * This library is free software; you can redistribute it and/or 008 * modify it under the terms of the GNU Lesser General Public 009 * License as published by the Free Software Foundation; either 010 * version 2.1 of the License, or (at your option) any later version. 011 * 012 * This library is distributed in the hope that it will be useful, 013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 015 * Lesser General Public License for more details. 016 * 017 * You should have received a copy of the GNU Lesser General Public 018 * License along with this library; if not, write to the Free Software 019 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 020 */ 021 022 package org.jdesktop.swingx.util; 023 024 import java.awt.Color; 025 import java.awt.Component; 026 import java.awt.Container; 027 import java.awt.Font; 028 import java.awt.FontMetrics; 029 import java.awt.GradientPaint; 030 import java.awt.Graphics; 031 import java.awt.Graphics2D; 032 import java.awt.GraphicsConfiguration; 033 import java.awt.GraphicsDevice; 034 import java.awt.GraphicsEnvironment; 035 import java.awt.Image; 036 import java.awt.Paint; 037 import java.awt.Rectangle; 038 import java.awt.geom.Rectangle2D; 039 import java.awt.image.BufferedImage; 040 import javax.swing.BorderFactory; 041 import javax.swing.JComponent; 042 import javax.swing.JLabel; 043 import javax.swing.SwingConstants; 044 import javax.swing.border.BevelBorder; 045 import javax.swing.border.Border; 046 047 /** 048 * A collection of utilties for painting visual effects. 049 * 050 * @author Mark Davidson 051 */ 052 public class PaintUtils { 053 054 // Utility methods. 055 private static Border defaultBorder = 056 BorderFactory.createBevelBorder(BevelBorder.RAISED); 057 058 private PaintUtils() { 059 } 060 061 public static Border getDefaultBorder() { 062 return defaultBorder; 063 } 064 065 /** 066 * Returns the bounds that the text of a label will be drawn into. 067 * Takes into account the current font metrics. 068 */ 069 public static Rectangle getTextBounds(Graphics g, JLabel label) { 070 FontMetrics fm = g.getFontMetrics(); 071 Rectangle2D r2d = fm.getStringBounds(label.getText(), g); 072 Rectangle rect = r2d.getBounds(); 073 int xOffset = 0; 074 switch (label.getHorizontalAlignment()) { 075 case SwingConstants.RIGHT: 076 case SwingConstants.TRAILING: 077 xOffset = label.getBounds().width - rect.width; 078 break; 079 case SwingConstants.CENTER: 080 xOffset = (label.getBounds().width - rect.width) / 2; 081 break; 082 default: 083 case SwingConstants.LEFT: 084 case SwingConstants.LEADING: 085 xOffset = 0; 086 break; 087 } 088 int yOffset = 0; 089 switch (label.getVerticalAlignment()) { 090 case SwingConstants.TOP: 091 yOffset = 0; 092 break; 093 case SwingConstants.CENTER: 094 yOffset = (label.getBounds().height - rect.height) / 2; 095 break; 096 case SwingConstants.BOTTOM: 097 yOffset = label.getBounds().height - rect.height; 098 break; 099 } 100 return new Rectangle(xOffset, yOffset, rect.width, rect.height); 101 } 102 103 /** 104 * Paints a top to bottom gradient fill over the component bounds 105 * from color1 to color2. 106 */ 107 public static void paintGradient(Graphics g, JComponent comp, 108 Color color1, Color color2) { 109 GradientPaint paint = new GradientPaint(0, 0, color1, 110 0, comp.getHeight(), color2, 111 true); 112 Graphics2D g2 = (Graphics2D) g; 113 Paint oldPaint = g2.getPaint(); 114 g2.setPaint(paint); 115 g2.fillRect(0, 0, comp.getWidth(), comp.getHeight()); 116 g2.setPaint(oldPaint); 117 } 118 119 /** 120 * Sets the background color for a containment hierarchy. 121 */ 122 public static void setBackgroundColor(Container cont, Color color) { 123 cont.setBackground(color); 124 Component[] children = cont.getComponents(); 125 for (Component aChildren : children) { 126 if (aChildren instanceof Container) { 127 setBackgroundColor((Container) aChildren, color); 128 } else { 129 aChildren.setBackground(color); 130 } 131 } 132 } 133 134 /** 135 * Sets the foreground color for a containment hierarchy. 136 */ 137 public static void setForegroundColor(Container cont, Color color) { 138 cont.setForeground(color); 139 Component[] children = cont.getComponents(); 140 for (Component aChildren : children) { 141 if (aChildren instanceof Container) { 142 setForegroundColor((Container) aChildren, color); 143 } else { 144 aChildren.setForeground(color); 145 } 146 } 147 } 148 149 public static void setFont(Container cont, Font font) { 150 cont.setFont(font); 151 Component[] children = cont.getComponents(); 152 for (Component aChildren : children) { 153 if (aChildren instanceof Container) { 154 setFont((Container) aChildren, font); 155 } else { 156 aChildren.setFont(font); 157 } 158 } 159 } 160 161 /** 162 * @param width the width of the new BufferedImage 163 * @param height the height of the new BufferedImage 164 * 165 * @return Creates and returns a BufferedImage that is "compatible" with this machines 166 * video card and subsystem 167 */ 168 public static BufferedImage createCompatibleImage(int width, int height) { 169 GraphicsEnvironment environment = 170 GraphicsEnvironment.getLocalGraphicsEnvironment(); 171 GraphicsDevice screenDevice = environment.getDefaultScreenDevice(); 172 GraphicsConfiguration configuration = 173 screenDevice.getDefaultConfiguration(); 174 return configuration.createCompatibleImage(width, height); 175 } 176 177 /** 178 * @param width the width of the new BufferedImage 179 * @param height the height of the new BufferedImage 180 * @param transparency one of the values in the Transparency interface 181 * 182 * @return Creates and returns a BufferedImage that is "compatible" with this machines 183 * video card and subsystem with the given Transparency. 184 */ 185 public static BufferedImage createCompatibleImage(int width, int height, 186 int transparency) { 187 GraphicsEnvironment environment = 188 GraphicsEnvironment.getLocalGraphicsEnvironment(); 189 GraphicsDevice screenDevice = environment.getDefaultScreenDevice(); 190 GraphicsConfiguration configuration = 191 screenDevice.getDefaultConfiguration(); 192 return configuration.createCompatibleImage(width, height, transparency); 193 } 194 195 public static BufferedImage convertToBufferedImage(Image img) { 196 BufferedImage buff = createCompatibleImage(img.getWidth(null),img.getHeight(null)); 197 Graphics2D g2 = buff.createGraphics(); 198 g2.drawImage(img,0,0,null); 199 g2.dispose(); 200 return buff; 201 } 202 }