我就纳闷了,我们中国程序员tm几百上千万,就没有一个人能解决这个问题吗,我辛辛苦苦搜了大半天,各种无语的博客文章,真的是不想说了,直接去stackoverflow,几分钟就找到解决方案了。
原文: https://stackoverflow.com/a/26417276/14692176
废话不多说,直接上代码
1. 窗体阴影边框面板
效果图
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
/**
* //TODO
* <br/>Created in 15:35 2021/4/24
*
* @author: enncy
*/
public class DropShadowPanel extends JPanel {
private static final long serialVersionUID = 1L;
//最大阴影透明度
private static final int TOP_OPACITY = 20;
//阴影大小像素
public int pixels;
public DropShadowPanel(int pix) {
this.pixels = pix;
Border border = BorderFactory.createEmptyBorder(pixels, pixels, pixels, pixels);
this.setBorder(BorderFactory.createCompoundBorder(this.getBorder(), border));
this.setLayout(new BorderLayout());
}
@Override
protected void paintComponent(Graphics g) {
int shade = 0;
for (int i =0; i<pixels; i++) {
double opacity = TOP_OPACITY * ((double) 1 / (double) (i==0?1:i));
drawShadow(g, shade, pixels-i, (int) opacity);
}
}
/**
* 绘制阴影
*
* @param g 绘图对象
* @param shade 颜色值
* @param i 边框层次
* @return: void
*/
private void drawShadow(Graphics g, int shade, int i, int opacity) {
System.out.println(opacity);
g.setColor(new Color(shade, shade, shade, opacity));
g.fillRoundRect(i + 1, i + 1, this.getWidth() - ((i * 2) + 1), this.getHeight() - ((i * 2) + 1), pixels, pixels);
}
}
int pix
这个参数的意思就是阴影的宽度
我自己修改了一点代码,原理其实差不多的,
double opacity = TOP_OPACITY * ((double) 1 / (double) (i==0?1:i));
这句话的意思就是透明度 TOP_OPACITY
随着 i
值递减,y=1/x
用法
参考 https://blog.csdn.net/qq_31254489/article/details/116103701
2. 组件阴影边框
参照上面的代码,不变,只需修改透明度
private static final int TOP_OPACITY = 20;
改成
private static final int TOP_OPACITY = 4;
JFrame jFrame = new JFrame();
jFrame.setLayout(new FlowLayout());
JPanel jPanel = new DropShadowPanel(8);
jPanel.setLayout(new FlowLayout());
jPanel.setSize(100,100);
jPanel.add(new JLabel("阴影边框"));
jFrame.add(jPanel,BorderLayout.CENTER);
jFrame.setSize(500,500);
jFrame.setLocationRelativeTo(null);
jFrame.setVisible(true);
原理大概就是 for 循环画矩形,然后每一层的透明度都递减。
对我这种Graphics画图小白真的是噩梦,国内找半天找不到,真的想吐。