前言

假期在家写登陆系统,想要给JFrame添加一个背景图片,所以记录一下如何添加。

分层面板法

思路

利用JLayeredPane类,给组件进行分级,将图片置于最底层,其余组件依次向上排列。

代码

import javax.swing.*;
import java.awt.*;

public class JFrameTest extends JFrame {

    private JButton login;//登录


    private final ImageIcon title = new ImageIcon("Img/title.jpg");
    private final JPanel titlepanel = new JPanel();
    private final JLabel titlelabel = new JLabel(title);

    private JLayeredPane jLayeredPane = new JLayeredPane();//分层

    public JFrameTest(){
        this.setLayeredPane(jLayeredPane);
        this.setSize(new Dimension(800,600));
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        loginexitadd();
        imageadd();
        this.setVisible(true);
    }
 /**
     * 添加按钮
     */
    public void loginexitadd(){
        login = new JButton("登录");
        login.setBounds(100,100,200,200);
        jLayeredPane.add(login,300);
    }
    /**
     * 添加图片
     */
    public void imageadd(){

        titlepanel.setBounds(0,-10,title.getIconWidth(),title.getIconHeight());
        titlepanel.add(titlelabel);
        jLayeredPane.add(titlepanel,100);
    }

    public static void main(String[] args) {
        new JFrameTest();
    }
}

解析

private JLayeredPane jLayeredPane = new JLayeredPane();//分层
//创建分级面板对象
jLayeredPane.add(login,300);//将按钮放到分级面板上
jLayeredPane.add(titlepanel,100);//同上
//第二个参数的数值越大说明级别越高即越靠上
login.setBounds(100,100,200,200);//定位位置与大小
titlepanel.setBounds(0,-10,title.getIconWidth(),title.getIconHeight());//同上
//分级面板类似于绝对布局,所以需要手动指定位置和大小

效果图

重写JPanel法

思路

利用JPanel方法中的paintComponent方法将图片画到JPanel上并将其放在JFrame上。

代码

package com.test;


import java.awt.*;

import javax.swing.*;


public class IMGTest extends JFrame {
    //创建背景面板。
    Backgroundpanel bgp;

    //创建一个按钮,用来证明我们的确是创建了背景图片,而不是一张图片。
    JButton jb;

    public static void main(String[] args) {
        new IMGTest();
    }

    public IMGTest() {
        //不采用任何布局方式。
        this.setLayout(null);

        bgp = new Backgroundpanel((new ImageIcon("Img/title.jpg")).getImage());
        bgp.setBounds(0, 0, 800, 600);

        //创建按钮
        jb = new JButton("测试按钮");
        jb.setBounds(100, 100, 260, 30);
        this.add(jb);
        this.add(bgp);//最后添加图片,防止遮挡按钮等

        this.setSize(800, 600);
        this.setLocation(400, 600);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }
}

class Backgroundpanel extends JPanel {

    private Image img;

    public Backgroundpanel() {
    }

    public Backgroundpanel(Image img) {
        this.img = img;
        this.setOpaque(true);//设置组件不透明
    }

    /**
     * 画出图片
     */
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this);//画出图片
    }
}

解析

非常简单的思路,创建一个内部类,又类继承JPanel并重写paintComponent方法。以此达到放置背景图片的方法,要注意添加背景图一定要在其他组件添加完成后添加,不然会遮挡组件。

效果图同上.


一只小菜鸡