首页 > 编程知识 正文

阴影边框怎么设置,蓝色阴影边框怎么添加

时间:2023-05-06 01:19:20 阅读:256296 作者:1142

我就纳闷了,我们中国程序员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 这个参数的意思就是阴影的宽度
我自己修改了一点代码,原理其实差不多的,

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画图dydhj真的是噩梦,国内找半天找不到,真的想吐。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。