Swing 关于JPanel背景图片、JButton按钮不显示的解决办法

本文解决问题:

1.背景图片正常显示,而 JButton 按钮透明,看不到却可以点击。


2.只出现 JButton 按钮而不显示背景图片。







前提:

为 JPanel 设置背景图片常用的两种方式:


1.定义一个 ImageIcon 对象,并指定图片。把这个 ImageIcon 放到一个 JLabel 中,再将这个 JLabel 放到要显示的 JPanel 中。


2.重写要显示的 JPanel 的 protected void paintComponent(Graphics g) 函数,网上也有例子不再赘述。


这里是针对第一种方式遇到的问题,网上的解决方法比较杂,这里是提出自己的总结。









首先,两个基本知识点


一、JFrame 的层次结构

Swing 关于JPanel背景图片、JButton按钮不显示的解决办法_第1张图片

我们主要关注 JLayeredPane 和 Content Pane。为什么呢,因为我们是把背景图片放在 JLayeredPane 上,而把其他组件(JButton、JTextField 等)放在 Content Pane 上。


二、组件的 Opaque 透明属性。setOpaque(boolean) 用来设置组件的透明属性,true 为不透明,false 为透明。


-------------------------------------------分界线--------------------------------------------------
由上面的知识可得,若出现开头提及的问题1,可能的原因有:

1.背景图片没有放在 JLayeredPane 中,而是和 JButton 放在了同一个 JPanel 并作为 Content Pane 显示出来。

2.按钮设置为了透明。


对于问题2:

1.Content Pane 没有设置为透明。

2.A、B都是 JPanel 对象。若组件(JButton、JTextField 等)放在了 A 上,A 放在 B 上,B 作为 Content Pane,则 A、B 都要设置为透明,否则看不到背景图片。本人就是把多个 JPanel 放在了一个 JPanel container 里,并用CardLayout 布局进行管理,而多个 JPanel 都设置了透明,但这个最底层的 JPanel container 没有设置为透明,一直看不到背景图片。




最后,其实添加背景图片是可以用一个JPanel完成的。

JPanel的add函数参数除了有组件的引用,还有一个重载版本add(JComponent c, Object contraints),第二个参数可以传入一些用作其他用户想做的处理的对象,如排序或者一些别的附带信息。

默认可以传入的整数有-1、0和1,其中如果把背景图片add到JPanel时传入-1,其他组件add到JPanel时传入0,就可以达到想要的效果。

经过测试,只有背景图片附带信息-1(可以省略),其他组件附带信息0(不能省略),可以达到背景图片的效果,其他组合都不行,有兴趣的读者不妨试一试。




如有错误,恳请指出。


你可能感兴趣的:(Java基础)