Java 笔记分享 — GUI 系列 —— 大同小异的两种窗体背景图设置方式

第一种方式

  • 简单解释

其实这两种方式都是将图片放到层叠容器的最底层,再把其他容器设置为透明以防止图片被其他容器遮挡。

如果图片放置在一个容器中,还要注意把这个放置图片的容器的大小设置为图片的大小,防止图片显示不够完整。

层叠容器只能放置组件,组件有哪些?如下图(图片来自菜鸟有觉悟要努力了

可以看出来众多组件中,并没有图片组件,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);
    }

}

运行结果

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值