You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swing中如何制作带圆角与阴影效果的JPanel?

解决JPanel同时实现圆角和阴影的问题

问题分析

你当前代码的核心问题有两个:

  1. 在paintComponent方法内设置边框,会导致每次重绘重复创建边框实例,且默认不透明的JPanel会遮挡阴影;
  2. 自定义圆角绘制顺序错误,覆盖了边框的阴影效果。

修正方案一:结合透明面板与阴影边框

通过设置面板为透明,让阴影边框正常显示,同时自定义绘制圆角背景:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 12:07:13