001 /*
002 * Copyright 2002-2006 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005 * use this file except in compliance with the License. You may obtain a copy of
006 * the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013 * License for the specific language governing permissions and limitations under
014 * the License.
015 */
016 package org.springframework.richclient.components;
017
018 import java.awt.AWTException;
019 import java.awt.Color;
020 import java.awt.Graphics;
021 import java.awt.Graphics2D;
022 import java.awt.Rectangle;
023 import java.awt.Robot;
024 import java.awt.image.BufferedImage;
025 import java.awt.image.ConvolveOp;
026 import java.awt.image.Kernel;
027
028 import javax.swing.JFrame;
029
030 /**
031 * Idea originally from http://jroller.com/page/gfx?entry=better_shadow
032 *
033 * @author Romain Guy
034 * @author Peter De Bruycker
035 */
036 public class ShadowBorderFrame extends JFrame {
037 private BufferedImage backgroundImage;
038 private static final int SHADOW_WIDTH = 14;
039
040 public void paint(Graphics g) {
041 g.drawImage(backgroundImage, 0, 0, this);
042 super.paint(g);
043 }
044
045 public void show() {
046 createShadowBorder();
047 super.show();
048 setSize(getWidth() + SHADOW_WIDTH, getHeight() + SHADOW_WIDTH);
049 }
050
051 private void createShadowBorder() {
052 backgroundImage =
053 new BufferedImage(getWidth() + SHADOW_WIDTH, getHeight() + SHADOW_WIDTH, BufferedImage.TYPE_INT_ARGB);
054 Graphics2D g2 = (Graphics2D) backgroundImage.getGraphics();
055
056 try {
057 Robot robot = new Robot(getGraphicsConfiguration().getDevice());
058 BufferedImage capture =
059 robot.createScreenCapture(
060 new Rectangle(getX(), getY(), getWidth() + SHADOW_WIDTH, getHeight() + SHADOW_WIDTH));
061 g2.drawImage(capture, null, 0, 0);
062 }
063 catch (AWTException e) {
064 e.printStackTrace();
065 }
066
067 BufferedImage shadow =
068 new BufferedImage(getWidth() + SHADOW_WIDTH, getHeight() + SHADOW_WIDTH, BufferedImage.TYPE_INT_ARGB);
069 Graphics graphics = shadow.getGraphics();
070 graphics.setColor(new Color(0.0f, 0.0f, 0.0f, 0.3f));
071 graphics.fillRoundRect(6, 6, getWidth(), getHeight(), 12, 12);
072
073 g2.drawImage(shadow, getBlurOp(7), 0, 0);
074 }
075
076
077 private ConvolveOp getBlurOp(int size) {
078 float[] data = new float[size * size];
079 float value = 1 / (float) (size * size);
080 for (int i = 0; i < data.length; i++) {
081 data[i] = value;
082 }
083 return new ConvolveOp(new Kernel(size, size, data));
084 }
085 }