我就納悶了,我們中國程式員tm幾百上千萬,就沒有一個人能解決這個問題嗎,我辛辛苦苦搜了大半天,各種無語的部落格文章,真的是不想說了,直接去stackoverflow,幾分鐘就找到解決方案了。
原文: https://stackoverflow.com/questions/13368103/jpanel-drop-shadow
往下面翻,是一個叫
Derek 朕會功夫
寫的
廢話不多說,直接上代碼
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
這個參數的意思就是陰影的寬度
我自己修改了一點代碼,原理其實差不多的,
這句話的意思就是透明度
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畫圖小白真的是噩夢,國内找半天找不到,真的想吐。