Swing Jpanel实现圆角的问题

publicclassRoundPanelextendsJPanel{//背景图片privateImageIconimg;//圆角范围privateintarcWidth... public class RoundPanel extends JPanel { //背景图片 private ImageIcon img; //圆角范围 private int arcWidth; private static final long serialVersionUID = 1L; public RoundPanel(){ } public RoundPanel(String imgPath){ img = new ImageIcon(imgPath); } public RoundPanel(String imgPath,int arcWidth){ this(imgPath); this.arcWidth = arcWidth; } @Override protected void paintComponent(Graphics g) { RoundRectangle2D rect = new RoundRectangle2D.Double(0,0,getWidth(),getHeight(),arcWidth,arcWidth); g.setClip(rect); if(img!=null) g.drawImage(img.getImage(), 0, 0, getWidth(), getHeight(), this); } public static void main(String[] args) { JFrame f = new JFrame(); RoundPanel rp = new RoundPanel("images/login_bg.png",30); rp.setOpaque(false); rp.setBackground(Color.BLACK); rp.setBorder(new LineBorder(Color.red)); JButton btn = new JButton("退出"); rp.add(btn); btn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(0); } }); f.add(rp); f.setSize(300, 300); f.setUndecorated(true); AWTUtilities.setWindowOpaque(f, false); SwingUtils.run(f); }}
=====================================
出现的效果是:背景图片是圆角的,但后面还有一层白底色,如
======================================================================
这问题我已经找到解决方案,写出来分享一下:把绘制圆角的代码挪一下位置:
public void paint(Graphics g) { RoundRectangle2D rect = new RoundRectangle2D.Double(0,0,getWidth(),getHeight(),arcWidth,arcWidth); g.setClip(rect); if(img!=null) g.drawImage(img.getImage(), 0, 0, getWidth(), getHeight(), this); }

paint() 与paintComponent()的主要区别是:前者是绘制容器,后者是绘制容器内的组件
效果:
展开
 我来答
jamxval
2014-09-19 · TA获得超过6822个赞
知道大有可为答主
回答量:4308
采纳率:82%
帮助的人:1424万
展开全部
final Shape shape = new RoundRectangle2D.Double(0d, 0d, f.getWidth(), f.getHeight(), 50, 50);

f.addComponentListener(new ComponentAdapter()
{

public void componentResized(ComponentEvent e)
{
f.setShape(shape);
}
});


上面这个能让 JFrame 确实是圆角且透明,但不知为何这个 JPanel 的边框绘制时依然不正确。

更多追问追答
追问
因为有背景图片,所以背景色设置无效!那圆角后面白色区域跟背景色无关,因为我不管怎么设置背景色,它都是白色!
追答

这个 setShare 替换一个圆角图形后,白色消失了吧。我试了透明和不透明,这个角都消失了,但只是那个 JPanel 的边框依然不正确。但分析完 LineBorder  的 paintBorder 方法后发现这是 LineBorder 的参数不合适的问题,当我们选择很小的 thickness 时它与外面的 JFrame 的 Shapre 不一致协调导致的,只要它们圆角的弧半径与外面 Jframe 的弧半径协调还是可以正确的封闭那个边框的。




推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式