1 7 8 package com.sun.java.swing.plaf.nimbus; 9 10 import javax.swing.border.Border ; 11 import javax.swing.JComponent ; 12 import javax.swing.plaf.UIResource ; 13 import java.awt.Insets ; 14 import java.awt.Component ; 15 import java.awt.Graphics ; 16 import java.awt.Graphics2D ; 17 import java.awt.Color ; 18 import java.awt.Transparency ; 19 import java.awt.RenderingHints ; 20 import java.awt.Dimension ; 21 import java.awt.image.BufferedImage ; 22 23 30 public class LoweredBorder extends AbstractRegionPainter implements Border { 31 private static final int IMG_SIZE = 30; 32 private static final int RADIUS = 13; 33 private static final Insets INSETS = new Insets (10,10,10,10); 34 private static final PaintContext PAINT_CONTEXT = new PaintContext(INSETS, 35 new Dimension (IMG_SIZE,IMG_SIZE),false, 36 PaintContext.CacheMode.NINE_SQUARE_SCALE, 37 Integer.MAX_VALUE, Integer.MAX_VALUE); 38 39 42 @Override  43 protected Object [] getExtendedCacheKeys(JComponent c) { 44 return new Object [] {c.getBackground()}; 45 } 46 47 69 protected void doPaint(Graphics2D g, JComponent c, int width, int height, 70 Object [] extendedCacheKeys) { 71 BufferedImage img1,img2; 72 if (g instanceof Graphics2D ) { 73 img1 = ((Graphics2D )g).getDeviceConfiguration(). 74 createCompatibleImage(IMG_SIZE,IMG_SIZE, 75 Transparency.TRANSLUCENT); 76 img2 = ((Graphics2D )g).getDeviceConfiguration(). 77 createCompatibleImage(IMG_SIZE,IMG_SIZE, 78 Transparency.TRANSLUCENT); 79 } else { 80 img1 = new BufferedImage (IMG_SIZE,IMG_SIZE, 81 BufferedImage.TYPE_INT_ARGB); 82 img2 = new BufferedImage (IMG_SIZE,IMG_SIZE, 83 BufferedImage.TYPE_INT_ARGB); 84 } 85 Graphics2D g2 = (Graphics2D )img1.getGraphics(); 87 g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 88 RenderingHints.VALUE_ANTIALIAS_ON); 89 g2.setColor(c.getBackground()); 90 g2.fillRoundRect(2,0,26,26,RADIUS,RADIUS); 91 g2.dispose(); 92 InnerShadowEffect effect = new InnerShadowEffect(); 94 effect.setDistance(1); 95 effect.setSize(3); 96 effect.setColor(getLighter(c.getBackground(),2.1f)); 97 effect.setAngle(90); 98 effect.applyEffect(img1,img2,IMG_SIZE,IMG_SIZE); 99 g2 = (Graphics2D )img2.getGraphics(); 101 g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 102 RenderingHints.VALUE_ANTIALIAS_ON); 103 g2.setClip(0,28,IMG_SIZE,1); 104 g2.setColor(getLighter(c.getBackground(),0.90f)); 105 g2.drawRoundRect(2,1,25,25,RADIUS,RADIUS); 106 g2.dispose(); 107 if (width != IMG_SIZE || height != IMG_SIZE){ 109 ImageScalingHelper.paint(g,0,0,width,height,img2, INSETS, INSETS, 110 ImageScalingHelper.PaintType.PAINT9_STRETCH, 111 ImageScalingHelper.PAINT_ALL); 112 } else { 113 g.drawImage(img2,0,0,c); 114 } 115 img1 = null; 116 img2 = null; 117 } 118 119 133 protected PaintContext getPaintContext() { 134 return PAINT_CONTEXT; 135 } 136 137 140 145 public Insets getBorderInsets(Component c) { 146 return INSETS; 147 } 148 149 153 public boolean isBorderOpaque() { 154 return false; 155 } 156 157 168 public void paintBorder(Component c, Graphics g, int x, int y, int width, 169 int height) { 170 JComponent comp = (c instanceof JComponent )?(JComponent )c:null; 171 if (g instanceof Graphics2D ){ 172 Graphics2D g2 = (Graphics2D )g; 173 g2.translate(x,y); 174 paint(g2,comp, width, height); 175 g2.translate(-x,-y); 176 } else { 177 BufferedImage img = new BufferedImage (IMG_SIZE,IMG_SIZE, 178 BufferedImage.TYPE_INT_ARGB); 179 Graphics2D g2 = (Graphics2D )img.getGraphics(); 180 paint(g2,comp, width, height); 181 g2.dispose(); 182 ImageScalingHelper.paint(g,x,y,width,height,img,INSETS, INSETS, 183 ImageScalingHelper.PaintType.PAINT9_STRETCH, 184 ImageScalingHelper.PAINT_ALL); 185 } 186 } 187 188 private Color getLighter(Color c, float factor){ 189 return new Color (Math.min((int)(c.getRed()/factor), 255), 190 Math.min((int)(c.getGreen()/factor), 255), 191 Math.min((int)(c.getBlue()/factor), 255)); 192 } 193 } 194 195 | Popular Tags |