第一种方式
-
简单解释
其实这两种方式都是将图片放到层叠容器的最底层,再把其他容器设置为透明以防止图片被其他容器遮挡。
如果图片放置在一个容器中,还要注意把这个放置图片的容器的大小设置为图片的大小,防止图片显示不够完整。
层叠容器只能放置组件,组件有哪些?如下图(图片来自菜鸟有觉悟要努力了)
可以看出来众多组件中,并没有图片组件,Image 和 ImageIcon 都是类不是组件,那我的图片怎么显示?
解决方案就是找一个能显示图片的组件,把它或是存放它的容器放到分层容器的最底层。
担此重任的就是 JLabel 了,JLabel 只能显示 ImageIcon 类图片。
-
代码实现
public class ATMUI {
public static void main(String[] args) {
ATMUI atmUi = new ATMUI();
}
public ATMUI() {
JFrame jFrame = new JFrame("背景图片设置");
// 实例化一个层叠容器
JLayeredPane jLayeredPane = new JLayeredPane();
// 实例化一个容器用于放置标签
JPanel jPanel = new JPanel();
// 图片文件夹img应放在项目文件夹的下一级就行,即图片位置是 projectName/img/bg.jpg
ImageIcon imageIcon = new ImageIcon("img/bg.jpg");
// 为什么不能直接使用 Iamge 或是 ImageIcon?这是因为层叠容器只能放组件,而Image和ImageIcon都不是组件而是类,而 JLabel 就是控件,所以只能使用 JLabel 来显示图片
JLabel jLabel = new JLabel(imageIcon);
jPanel.add(jLabel);
jPanel.setBounds(0,0,imageIcon.getIconWidth(),imageIcon.getIconHeight());
// 需要将容器设置为透明,就不会因为容器不透明遮住图片内容了
jPanel.setOpaque(false);
// 将放了图片的容器放进层叠容器的最底层
jLayeredPane.add(jPanel, new Integer(0));
// JFrame 相关属性最好放在最后再去设置,不然图片有可能显示不了
jFrame.add(jLayeredPane);
jFrame.setSize(imageIcon.getIconWidth(), imageIcon.getIconHeight());
jFrame.setVisible(true);
jFrame.setResizable(false);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
第二种方式
-
简单解释
每个窗体(JFrame)都由窗口(Frame),根面板(Root Pane),分层面板(Layered Pane),内容面板(Content Pane)和玻璃面板(Glass Pane)组成。(如下图)
这样的话,可以把图片标签(JLabel)组件放到窗体(JFrame)的分层面板(Layered Pane)最底层,再将分层面板前的内容面板(Content Pane)设置为透明或用另一个透明的面板替换,玻璃面板(Glass Pane)本身为透明所以无需操作。
-
代码实现
public class ATMUI {
public static void main(String[] args) {
ATMUI atmUi = new ATMUI();
}
public ATMUI() {
JFrame jFrame = new JFrame("背景图片设置");
ImageIcon imageIcon = new ImageIcon("img/bg.jpg");
JLabel jLabel = new JLabel(imageIcon);
jLabel.setBounds(0,0,imageIcon.getIconWidth(),imageIcon.getIconHeight());
// 生成内容面板
JPanel jPanel = new JPanel();
// 将内容面板设置为透明
jPanel.setOpaque(false);
// 将窗体自动生成的内容面板替换成透明的内容面板
jFrame.setContentPane(jPanel);
// 在窗体的分层面板的最底层添加图片标签
jFrame.getLayeredPane().add(jLabel, new Integer(Integer.MIN_VALUE));
jFrame.setSize(imageIcon.getIconWidth(), imageIcon.getIconHeight());
jFrame.setResizable(false);
jFrame.setVisible(true);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}