很久之前发在百度Java吧,很快被洪水淹没……
http://tieba.baidu.com/p/1977309130
最近想起来要用,稍微整理了一下发在这里算个存档吧。
代码中用到了 JHLab,只用其中的高斯模糊,可以在maven的repository找到:
http://mvnrepository.com/artifact/com.jhlabs/filters
先上用法示例和截图:
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.util.Arrays;
public class ShadowBorderTest extends JPanel {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("Test ShadowBorder");
frame.setContentPane(new ShadowBorderTest());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
ShadowBorderTest() {
super(new GridLayout(2, 2, 20, 20));
super.setBackground(Color.GRAY.brighter());
JPanel p1 = new JPanel();
p1.setBorder(BorderFactory.createCompoundBorder(
ShadowBorder.newInstance(),
BorderFactory.createLineBorder(Color.WHITE)
));
JPanel p2 = new JPanel();
p2.setBorder(BorderFactory.createCompoundBorder(
ShadowBorder.newBuilder().shadowSize(3).center().build(),
BorderFactory.createLineBorder(Color.WHITE)
));
JPanel p3 = new JPanel();
p3.setBorder(BorderFactory.createCompoundBorder(
ShadowBorder.newBuilder().shadowColor(Color.ORANGE).build(),
BorderFactory.createLineBorder(Color.WHITE)
));
JPanel p4 = new JPanel();
p4.setBorder(BorderFactory.createCompoundBorder(
ShadowBorder.newBuilder().shadowAlpha(0.7f).top().build(),
BorderFactory.createLineBorder(Color.WHITE)
));
Dimension d = new Dimension(150, 150);
for (JPanel p : Arrays.asList(p1, p2, p3, p4)) {
p.setPreferredSize(d);
add(p);
}
setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
}
}
然后是 ShadowBorder 类的代码:
/*
* Copyright 2012 wuyou (raistlic@gmail.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import com.jhlabs.image.GaussianFilter;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.geom.Area;
import java.awt.image.BufferedImage;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;
/**
* ShadowBorder is designed to be immutable, so that it can safely cache
* the "shadow fragments" images, and reuse them for efficiency.
*
* <p/>
* The shadow fragments images are determined by the size, color, and alpha
* of the shadow.
*
* <p/>
* Instance can be retrieved via an overloading {@code newInstance()} method
* or a {@code ShadowBorder.ObjectFactory} instance, using a "builder design pa