Static methods for some common painting functions
/* * @(#)PaintUtils.java 1.0 2008-03-01 * * Copyright (c) 2008 Jeremy Wood * E-mail: mickleness@gmail.com * All rights reserved. * * The copyright of this software is owned by Jeremy Wood. * You may not use, copy or modify this software, except in * accordance with the license agreement you entered into with * Jeremy Wood. For details see accompanying license terms. */ import java.awt.*; import javax.swing.*; /** Some static methods for some common painting functions. * * @version 1.0 * @author Jeremy Wood **/ public class PaintUtils { /** Four shades of white, each with increasing opacity. */ public final static Color[] whites = new Color[] { new Color(255,255,255,50), new Color(255,255,255,100), new Color(255,255,255,150) }; /** Four shades of black, each with increasing opacity. */ public final static Color[] blacks = new Color[] { new Color(0,0,0,50), new Color(0,0,0,100), new Color(0,0,0,150) }; /** @return the color used to indicate when a component has * focus. By default this uses the color (64,113,167), but you can * override this by calling: * <BR><code>UIManager.put("focusRing",customColor);</code> */ public static Color getFocusRingColor() { Object obj = UIManager.getColor("focusRing"); if(obj instanceof Color) return (Color)obj; return new Color(64,113,167); } /** Paints 3 different strokes around a shape to indicate focus. * The widest stroke is the most transparent, so this achieves a nice * "glow" effect. * <P>The catch is that you have to render this underneath the shape, * and the shape should be filled completely. * * @param g the graphics to paint to * @param shape the shape to outline * @param biggestStroke the widest stroke to use. */ public static void paintFocus(Graphics2D g,Shape shape,int biggestStroke) { Color focusColor = getFocusRingColor(); Color[] focusArray = new Color[] { new Color(focusColor.getRed(), focusColor.getGreen(), focusColor.getBlue(),255), new Color(focusColor.getRed(), focusColor.getGreen(), focusColor.getBlue(),170), new Color(focusColor.getRed(), focusColor.getGreen(), focusColor.getBlue(),110) }; g.setStroke(new BasicStroke(biggestStroke)); g.setColor(focusArray[2]); g.draw(shape); g.setStroke(new BasicStroke(biggestStroke-1)); g.setColor(focusArray[1]); g.draw(shape); g.setStroke(new BasicStroke(biggestStroke-2)); g.setColor(focusArray[0]); g.draw(shape); g.setStroke(new BasicStroke(1)); } /** Uses translucent shades of white and black to draw highlights * and shadows around a rectangle, and then frames the rectangle * with a shade of gray (120). * <P>This should be called to add a finishing touch on top of * existing graphics. * @param g the graphics to paint to. * @param r the rectangle to paint. */ public static void drawBevel(Graphics g,Rectangle r) { drawColors(blacks,g, r.x, r.y+r.height, r.x+r.width, r.y+r.height, SwingConstants.SOUTH); drawColors(blacks,g, r.x+r.width, r.y, r.x+r.width, r.y+r.height, SwingConstants.EAST); drawColors(whites,g, r.x, r.y, r.x+r.width, r.y, SwingConstants.NORTH); drawColors(whites,g, r.x, r.y, r.x, r.y+r.height, SwingConstants.WEST); g.setColor(new Color(120, 120, 120)); g.drawRect(r.x, r.y, r.width, r.height); } private static void drawColors(Color[] colors,Graphics g,int x1,int y1,int x2,int y2,int direction) { for(int a = 0; a<colors.length; a++) { g.setColor(colors[colors.length-a-1]); if(direction==SwingConstants.SOUTH) { g.drawLine(x1, y1-a, x2, y2-a); } else if(direction==SwingConstants.NORTH) { g.drawLine(x1, y1+a, x2, y2+a); } else if(direction==SwingConstants.EAST) { g.drawLine(x1-a, y1, x2-a, y2); } else if(direction==SwingConstants.WEST) { g.drawLine(x1+a, y1, x2+a, y2); } } } }