Swing中如何制作带圆角与阴影效果的JPanel?
解决JPanel同时实现圆角和阴影的问题
问题分析
你当前代码的核心问题有两个:
- 在
paintComponent方法内设置边框,会导致每次重绘重复创建边框实例,且默认不透明的JPanel会遮挡阴影; - 自定义圆角绘制顺序错误,覆盖了边框的阴影效果。
修正方案一:结合透明面板与阴影边框
通过设置面板为透明,让阴影边框正常显示,同时自定义绘制圆角背景:
JPanel panel = new JPanel() { @Override protected void paintComponent(Graphics g) { Graphics2D graphics = (Graphics2D) g.create(); // 开启抗锯齿,让圆角更平滑 graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // 绘制白色圆角背景 graphics.setColor(Color.WHITE); graphics.fillRoundRect(0, 0, getWidth() - 1, getHeight() - 1, 10, 10); graphics.dispose(); super.paintComponent(g); } }; // 设置面板为透明,避免遮挡阴影 panel.setOpaque(false); // 配置阴影边框(此处假设DropShadowBorder为可用类,如SwingX中的实现) panel.setBorder(new DropShadowBorder(Color.GRAY, 3, 5, 0, true, true, true, true));
修正方案二:手动绘制阴影+圆角
如果不想依赖第三方边框类,可以直接在paintComponent中手动绘制阴影和圆角:
JPanel panel = new JPanel() { @Override protected void paintComponent(Graphics g) { Graphics2D graphics = (Graphics2D) g.create(); graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // 绘制半透明阴影(偏移3像素模拟阴影位置) graphics.setColor(new Color(0, 0, 0, 50)); graphics.fillRoundRect(3, 3, getWidth() - 4, getHeight() - 4, 10, 10); // 绘制白色圆角背景 graphics.setColor(Color.WHITE); graphics.fillRoundRect(0, 0, getWidth() - 1, getHeight() - 1, 10, 10); graphics.dispose(); super.paintComponent(g); } }; panel.setOpaque(false);
关键注意事项
- 永远不要在
paintComponent内设置边框、布局等组件属性,这类操作应在组件初始化阶段完成; - 自定义背景绘制时必须设置
setOpaque(false),否则JPanel默认的不透明背景会覆盖你的绘制内容; - 使用
g.create()创建Graphics副本,绘制完成后调用dispose()释放资源,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

