Java Swing 怎么自定义界面背景图片

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java Swing 怎么自定义界面背景图片相关的知识,希望对你有一定的参考价值。

怎么用JFileChoose在电脑中选择一张图片,确定后将图片设置问JFrame界面背景图片??

高手帮忙啊,请尽量写详细的代码。谢谢!
2楼的没效果啊。...我实在是做不出了...急要啊....

在java swing中需要为容器添加自定义图片或者背景图片。提供两种简单的解决方案,一种利用JPanel,另一种利用JLabel,代码如下:

1、JPanel(源代码)

package oo;  
import java.awt.Graphics;  
import java.awt.Image;  
import java.io.File;  
import javax.swing.ImageIcon;  
import javax.swing.JFrame;  
import javax.swing.JPanel;  

public class Drawing   
  
    JFrame jframe = new JFrame();  
    public static JPanel GImage = null;  
  
    public Drawing()   
        initFrame();  
      
  
    // 初始化窗口  
    public void initFrame()   
        // 利用JPanel添加背景图片  
  
        GImage = new JPanel()   
  
            protected void paintComponent(Graphics g)   
                ImageIcon icon = new ImageIcon("image\\\\benbenla.jpg");  
                Image img = icon.getImage();  
                g.drawImage(img, 0, 0, icon.getIconWidth(),  
                        icon.getIconHeight(), icon.getImageObserver());  
                jframe.setSize(icon.getIconWidth(), icon.getIconHeight());  
  
              
  
        ;  
        jframe.setTitle("测试背景图片");  
        jframe.add(GImage);  
        jframe.pack();  
        jframe.setVisible(true);  
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  
      
  
    public static void main(String[] args)   
        new Drawing();  
  
      
  

2、JLabel源代码

package swing.draw;  
import java.awt.Image;  
import javax.swing.ImageIcon;  
import javax.swing.JFrame;  
import javax.swing.JLabel; 
 
/** 利用JLabel来构建图片 */  
public class Drawing2   
    JLabel jlpic = new JLabel();  
    JFrame jframe = new JFrame();  
  
    public Drawing2()   
  
        init1Frame();  
      
  
    public void init1Frame()   
        ImageIcon icon = new ImageIcon("image\\\\benbenla.jpg");  
        icon.setImage(icon.getImage().getScaledInstance(icon.getIconWidth(),  
                icon.getIconHeight(), Image.SCALE_DEFAULT));  
        System.out.println(icon.getIconHeight() + "" + icon.getIconWidth());  
        jlpic.setBounds(0, 0, 1366, 768);  
        jlpic.setHorizontalAlignment(0);  
        jlpic.setIcon(icon);  
        jframe.setSize(1366, 768);  
        jframe.add(jlpic);  
        jframe.pack();  
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
        jframe.setVisible(true);  
  
      
  
    public static void main(String args[])   
  
        new Drawing2();  
      

添加控件:

jlpic.setIcon(icon);    
Container c = new Container();  
JLabel user = new JLabel("用户:");  
JLabel password = new JLabel("密码:");  
JTextField txf_userName = new JTextField();  
JPasswordField pwd_password = new JPasswordField()  
  
public void paste()  
UIManager.getLookAndFeel().provideErrorFeedback(this);  
   
;  
user.setBounds(200,25,50,25);  
password.setBounds(200,52,50,25);  
txf_userName.setBounds(300,25,150,25);  
pwd_password.setBounds(300,52,150,25);  
c.add(user);  
c.add(txf_userName);  
c.add(password);  
c.add(pwd_password);  
c.add(jlpic);  
jframe.setSize(1366, 768);    
// jframe.add();    
jframe.add(c);
参考技术A 不要凡事都要靠别人,代码要自己写才行的。
如果你要自定义其他功能的的SWING组件,可继承相应的组件再增减功能。
对于你的要求,我可以提供一些思路:
JFrame查看JDK可以知道他是由3个面板嵌套组成,其中contentPane用于显示界面的,并且还提供了一个方法进行设置:setContenPane(Container coneainer)
显然我们可以自定义一个Panel进行替换。
在SWING中,JPanel可以做为一个基类添加自己的功能,只要继承自己的功能就可以实现了,一般组件的绘制方面的功能增加离不开paintConpenment(Graphic)
那么我们只要在绘制JPanel的后面再绘制一张图片就可以了。本回答被提问者采纳
参考技术B 楼上说的对,下面是一个具体代码 ,直接拷贝运行即可查看效果

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
@SuppressWarnings("serial")
class MyFrame extends JFrame implements ActionListener
JButton exitB;
public MyFrame()
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(200,200);
exitB=new JButton("退出");
exitB.setToolTipText("安全退出系统");
JPanel lowerPanel=new MyPanel(); //在底部添加一个Panel
Container c=this.getContentPane();
lowerPanel.add(exitB); //pannel上添加其他组件
c.add(lowerPanel); //Frame上添加Panel
exitB.addActionListener(this);


@Override
public void actionPerformed(ActionEvent e)
if (e.getSource()==exitB)

shutdown();


private void shutdown()
System.exit(0);


public static void main(String[]args)
new MainformFrame();




//自定义面板 继承JPanel
class MyPanel extends JPanel
public void paintComponent(Graphics g) // 重绘函数
Graphics2D g2 = (Graphics2D)g;
super.paintComponent(g);
Image img = Toolkit.getDefaultToolkit().getImage("bg.jpg");
g2.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this); //在面板上绘制背景图片

参考技术C 把图片放在JLable上,在把JButton等组件放在JPabel,设置为透明的再放在JLAbel上,最后把JLabel放在另一个JPabel上,最后放在底层容器上。setLayout(null)布局。
private JPanel pan, back;
private JTextField tfName;
private JPasswordField tfPass;
private JButton OK, Cancel; private ImageIcon ii;
private JLabel lab, users, userpassword,;
ii = new ImageIcon("图片路径");
this.setLocation(250,100);//位置
pan = new JPanel();//用来放图片
users = new JLabel("用 户:");
users.setBounds(0, 0, 90, 70);//设置JLable的大小和位置,
userpassword = new JLabel("密 码:");
userpassword.setBounds(0, 40, 90, 70);
tfName = new JTextField(20);
tfName.setBounds(90, 25, 150, 23);
tfName.setOpaque(false);// 设置为透明
tfPass = new JPasswordField(20);
tfPass.setBounds(90, 65, 150, 23);
tfPass.setOpaque(false);
OK = new JButton("登陆");
OK.setBounds(20, 150, 60, 20);
Cancel = new JButton("取消");
Cancel.setBounds(90, 150, 60, 20);
back = new JPanel();//用于放JLable和JButton,JTextField
back.setBounds(60, 140, 310, 170);
back.setLayout(null);//布局为空
back.setOpaque(false);
back.add(users);//添加组件
back.add(userpassword);
back.add(tfName);
back.add(tfPass);
back.add(OK);
back.add(Cancel);
pan.add(back);//把放有组件的容器放装图片的容器上
pan.setLayout(null);
pan.setOpaque(false);
lab = new JLabel(ii);//把图片放在JLAbel上
lab.setBounds(0, 0, ii.getIconWidth(), ii.getIconHeight());//大小由图片的大小决定
this.getLayeredPane().setLayout(null);
this.getLayeredPane().add(lab, new Integer(Integer.MIN_VALUE));
this.setContentPane(pan);

Java使用图片自定义登录窗体

一、问题概述

Java是一门面向对象的编程语言,从出版至今,Java对其自身不断改进,Java的图形界面编程也做的越来越好,从AWT到更高级的Swing。但是,我们的需求永远是无法满足的,有时候我们需要自定义窗体,特别是一张漂亮的图片做一个窗体,那就再好不过了。那么,今天我就把用图片自定义应用窗体的方法分享给大家。

二、实现方法

1、用图片自定义应用窗体效果图;

Java使用图片自定义应用窗体效果图

                        图1 Java使用图片自定义应用窗体效果图

2、创建一个类继承Swing中JFrame,然后定义一个BufferedImage变量,用于设定应用窗体背景图,在定义一个ImageIcon变量,用来保存你自定义的图片;在根据图1的样子,分别定义两个JLable,一个JTextField,一个JPasswordField,三个JButton。图片的导入和组件的创建不在鳌诉。

说明:图1右上角的红色关闭窗体按钮是自定义图片p上去的,然后通过Java的鼠标事件来判断鼠标点击的范围是否在红色区域内,如果觉得上诉的按钮或者是文本框不好看,也可以用自定义的图片去定义样式,此内容不再本教程讲解范围之类,具体方法请参阅我博客“Java自定义图片按钮”。

下面给出变量代码:

// 用来设定窗体不规则样式的图片,这里只用它来创建窗体形状
private BufferedImage img; 
//用它来显示这张图片
private ImageIcon background;
//用户名输入框
private JTextField userText = new JTextField(30);
//密码输入框
private JPasswordField passwordText = new JPasswordField(30);
private JLabel userLabel = new JLabel("账 号:");
private JLabel passwordLabel = new JLabel("密 码: ");
private JButton okbtn = new JButton("确定");
private JButton resert = new JButton("重置");
private JButton register = new JButton("注册");
// 记录窗体移动的坐标
private Point origin; 

如果不使用JLable 来显示background图片,效果是这样的:

未设置背景图像效果图

                            图2 未设置背景图像效果图

为方便测试,再此给出图片原图(P得不是很好,P得越清晰,就越不容易产生锯齿和白边哦):

应用原图

                            图3 应用原图

3、创建一个和图片形状一样的窗体;

/**
* 创建和图片形状一样的窗体
 * 并监听窗体移动事件
 * @throws IOException
 */
private void initialize() throws IOException { // 窗体初始化
    // 设定窗体大小和图片一样大
    this.setSize(img.getWidth(null), img.getHeight(null));
    // 设定禁用窗体装饰,这样就取消了默认的窗体结构
    this.setUndecorated(true);
    // 初始化用于移动窗体的原点
    this.origin = new Point();

    // 调用AWTUtilities的setWindowShape方法设定本窗体为制定的Shape形状
    AWTUtilities.setWindowShape(this, getImageShape(img));
    // 设定窗体可见度
    AWTUtilities.setWindowOpacity(this, 0.8f);

    this.setLocationRelativeTo(null);
    this.setAlwaysOnTop(true);
    // 由于取消了默认的窗体结构,所以我们要手动设置一下移动窗体的方法
    this.addMouseListener(new OwnListener());
    //监听鼠标移动事件
    addMouseMotionListener(new MouseMotionAdapter() {
        public void mouseDragged(MouseEvent e) {
            Point p = getLocation();
            setLocation(p.x + e.getX() - origin.x, p.y + e.getY()
                    - origin.y);
        }
    });
}
/**
* 将Image图像转换为Shape图形
 * @param img
 * @return
 */
public Shape getImageShape(Image img) {
    ArrayList<Integer> x = new ArrayList<Integer>();
    ArrayList<Integer> y = new ArrayList<Integer>();
    int width = img.getWidth(null);// 图像宽度
    int height = img.getHeight(null);// 图像高度

    // 筛选像素
    // 首先获取图像所有的像素信息
    PixelGrabber pgr = new PixelGrabber(img, 0, 0, -1, -1, true);
    try {
        pgr.grabPixels();
    } catch (InterruptedException ex) {
        ex.getStackTrace();
    }
    int pixels[] = (int[]) pgr.getPixels();

    // 循环像素
    for (int i = 0; i < pixels.length; i++) {
        // 筛选,将不透明的像素的坐标加入到坐标ArrayList x和y中
        int alpha = getAlpha(pixels[i]);
        if (alpha == 0) {
            continue;
        } else {
            x.add(i % width > 0 ? i % width - 1 : 0);
            y.add(i % width == 0 ? (i == 0 ? 0 : i / width - 1) : i / width);
        }
    }

    // 建立图像矩阵并初始化(0为透明,1为不透明)
    int[][] matrix = new int[height][width];
    for (int i = 0; i < height; i++) {
        for (int j = 0; j < width; j++) {
            matrix[i][j] = 0;
        }
    }

    // 导入坐标ArrayList中的不透明坐标信息
    for (int c = 0; c < x.size(); c++) {
        matrix[y.get(c)][x.get(c)] = 1;
    }

    /*
     * 由于Area类所表示区域可以进行合并,我们逐一水平"扫描"图像矩阵的每一行,
     * 将不透明的像素生成为Rectangle,再将每一行的Rectangle通过Area类的rec
     * 对象进行合并,最后形成一个完整的Shape图形
     */
    Area rec = new Area();
    int temp = 0;

    for (int i = 0; i < height; i++) {
        for (int j = 0; j < width; j++) {
            if (matrix[i][j] == 1) {
                if (temp == 0)
                    temp = j;
                else if (j == width) {
                    if (temp == 0) {
                        Rectangle rectemp = new Rectangle(j, i, 1, 1);
                        rec.add(new Area(rectemp));
                    } else {
                        Rectangle rectemp = new Rectangle(temp, i,
                                j - temp, 1);
                        rec.add(new Area(rectemp));
                        temp = 0;
                    }
                }
            } else {
                if (temp != 0) {
                    Rectangle rectemp = new Rectangle(temp, i, j - temp, 1);
                    rec.add(new Area(rectemp));
                    temp = 0;
                }
            }
        }
        temp = 0;
    }
    return rec;
}

/**
 * 取得透明度
 * @param pixel
 * @return
 */
private int getAlpha(int pixel) {
    return (pixel >> 24) & 0xff;
}

4、初始化窗体并显示

/**
 * 构造方法
 * 初始化窗体
 */
public LoginWindow() {
    super();

    sql = new DriveSQL();

    background = new ImageIcon("image1\\\\login1.png");
    JLabel back = new JLabel(background);
    back.setBounds(0, 0, background.getIconWidth(),
            background.getIconHeight());
    /*
     * 首先初始化一张图片,我们可以选择一张有透明部分的不规则图片
     *  (要想图片能够显示透明,必须使用PNG格式的图片)
     */
    MediaTracker mt = new MediaTracker(this);

    try {
        img = ImageIO.read(new File("image1\\\\login1.png"));
    } catch (IOException e1) {
        e1.printStackTrace();
    }

    mt.addImage(img, 0);

    try {
        mt.waitForAll(); // 开始加载由此媒体跟踪器跟踪的所有图像
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    try {
        initialize(); // 窗体形状初始化
    } catch (IOException e) {
        e.printStackTrace();
    }

    addMenu();
    this.add(back);
    this.setVisible(true);
}
/**
 * 组件初始化
 */
public void addMenu() {
    //采用绝对布局,要将默认布局置空
    this.setLayout(null);
    //设置字体
    Font font = new Font("", 0, 18);
    userLabel.setForeground(Color.white);
    passwordLabel.setForeground(Color.white);
    userLabel.setFont(font);
    passwordLabel.setFont(font);
    passwordText.setEchoChar('*');

    userLabel.setBounds(80, 120, 100, 50);
    passwordLabel.setBounds(80, 160, 100, 50);
    userText.setBounds(140, 130, 170, 30);
    passwordText.setBounds(140, 170, 170, 30);
    okbtn.setBounds(81, 210, 60, 25);
    resert.setBounds(166, 210, 60, 25);
    register.setBounds(251, 210, 60, 25);

    this.add(userLabel);
    this.add(userText);
    this.add(passwordLabel);
    this.add(passwordText);
    this.add(okbtn);
    this.add(resert);
    this.add(register);

    okbtn.addMouseListener(new OwnListener());
    resert.addMouseListener(new OwnListener());
    register.addMouseListener(new OwnListener());
    userText.addKeyListener(new KeyOwnListener());
    passwordText.addKeyListener(new KeyOwnListener());
}

5、事件响应

/**
* 事件监听
 * @author Admin
 *
 */
private class OwnListener extends MouseAdapter {
    public void mousePressed(MouseEvent e) {
        origin.x = e.getX();
        origin.y = e.getY();
    }

    // 窗体上单击鼠标右键关闭程序
    public void mouseClicked(MouseEvent e) {
        //如果点击的区域位于右上角红色按钮,则关闭程序
        if (new Circle(350, 63, 11).contants(e.getX(), e.getY())) {
            System.exit(0);
        } else if (e.getSource() == okbtn) {
            //验证用户是否合法,并打开主程序
        } else if (e.getSource() == resert) {
            userText.setText("");
            passwordText.setText("");
        } else if (e.getSource() == register) {
            //打开注册页面
        }
    }

    public void mouseReleased(MouseEvent e) {
        super.mouseReleased(e);
    }
}

三、小结

1、要实现自定义图片创建窗体,必须使用Java的第三方库的类“AWTUtilities”,如果你在使用时发现找不到此类,原因可能是你的JDK版本过低或者是你配置时没有导入第三方库。如无法解决,请联系我。
2、创建窗体时,采用绝对布局,要将原有的默认布局置空,否则很难控制。具体原因可以自己去尝试。
3、如果要实现窗体透明,图片必须使用png格式,小编曾经就是实现不了透明效果头疼了很久,最后发现只有png格式的图片可以实现透明效果。
4、部分源码参考网络和前辈博客,感谢提供相应资料。
5、由于小编初出茅庐,文中难免有错误之处,还望指正,谢谢合作。

四、完整源码

import java.awt.Color;
import java.awt.Font;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.geom.Area;
import java.awt.image.BufferedImage;
import java.awt.image.PixelGrabber;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

import com.assistclass.Circle;
import com.data.Reader;
import com.frame.MainFrame;
import com.sqlservice.DriveSQL;
import com.sun.awt.AWTUtilities;

/**
 * 用户登录窗体
 * @author Admin
 *
 */
public class LoginWindow extends JFrame {

    private static final long serialVersionUID = 1L;
    private Point origin; // 用于移动窗体
    private BufferedImage img; // 用来设定窗体不规则样式的图片

    private ImageIcon background;
    private JTextField userText = new JTextField(30);
    private JPasswordField passwordText = new JPasswordField(30);
    private JLabel userLabel = new JLabel("账 号:");
    private JLabel passwordLabel = new JLabel("密 码: ");
    private JButton okbtn = new JButton("确定");
    private JButton resert = new JButton("重置");
    private JButton register = new JButton("注册");

    /**
     * 初始化窗体
     */
    public LoginWindow() {
        super();
        background = new ImageIcon("image1\\\\login1.png");
        JLabel back = new JLabel(background);
        back.setBounds(0, 0, background.getIconWidth(),
                background.getIconHeight());
        /*
         * 首先初始化一张图片,我们可以选择一张有透明部分的不规则图片
         *  (要想图片能够显示透明,必须使用PNG格式的图片)
         */
        MediaTracker mt = new MediaTracker(this);

        try {
            img = ImageIO.read(new File("image1\\\\login1.png"));
        } catch (IOException e1) {
            e1.printStackTrace();
        }

        mt.addImage(img, 0);

        try {
            mt.waitForAll(); // 开始加载由此媒体跟踪器跟踪的所有图像
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        try {
            initialize(); // 窗体形状初始化
        } catch (IOException e) {
            e.printStackTrace();
        }

        addMenu();
        this.add(back);
        this.setVisible(true);
    }

    /**
     * 组件初始化
     */
    public void addMenu() {
        this.setLayout(null);
        //设置字体
        Font font = new Font("", 0, 18);
        userLabel.setForeground(Color.white);
        passwordLabel.setForeground(Color.white);
        userLabel.setFont(font);
        passwordLabel.setFont(font);
        passwordText.setEchoChar('*');

        userLabel.setBounds(80, 120, 100, 50);
        passwordLabel.setBounds(80, 160, 100, 50);
        userText.setBounds(140, 130, 170, 30);
        passwordText.setBounds(140, 170, 170, 30);
        okbtn.setBounds(81, 210, 60, 25);
        resert.setBounds(166, 210, 60, 25);
        register.setBounds(251, 210, 60, 25);

        this.add(userLabel);
        this.add(userText);
        this.add(passwordLabel);
        this.add(passwordText);
        this.add(okbtn);
        this.add(resert);
        this.add(register);

        okbtn.addMouseListener(new OwnListener());
        resert.addMouseListener(new OwnListener());
        register.addMouseListener(new OwnListener());
        userText.addKeyListener(new KeyOwnListener());
        passwordText.addKeyListener(new KeyOwnListener());

        userText.setText("20160601");
        passwordText.setText("84878323");
    }

    /**
     * 创建和图片形状一样的窗体
     * @throws IOException
     */
    private void initialize() throws IOException { // 窗体初始化
        // 设定窗体大小和图片一样大
        this.setSize(img.getWidth(null), img.getHeight(null));
        // 设定禁用窗体装饰,这样就取消了默认的窗体结构
        this.setUndecorated(true);
        // 初始化用于移动窗体的原点
        this.origin = new Point();

        // 调用AWTUtilities的setWindowShape方法设定本窗体为制定的Shape形状
        AWTUtilities.setWindowShape(this, getImageShape(img));
        // 设定窗体可见度
        AWTUtilities.setWindowOpacity(this, 0.8f);

        this.setLocationRelativeTo(null);
        this.setAlwaysOnTop(true);
        // 由于取消了默认的窗体结构,所以我们要手动设置一下移动窗体的方法
        this.addMouseListener(new OwnListener());
        //监听鼠标移动事件
        addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseDragged(MouseEvent e) {
                Point p = getLocation();
                setLocation(p.x + e.getX() - origin.x, p.y + e.getY()
                        - origin.y);
            }
        });
    }

    /**
     * 将Image图像转换为Shape图形
     * @param img
     * @return
     */
    public Shape getImageShape(Image img) {
        ArrayList<Integer> x = new ArrayList<Integer>();
        ArrayList<Integer> y = new ArrayList<Integer>();
        int width = img.getWidth(null);// 图像宽度
        int height = img.getHeight(null);// 图像高度

        // 筛选像素
        // 首先获取图像所有的像素信息
        PixelGrabber pgr = new PixelGrabber(img, 0, 0, -1, -1, true);
        try {
            pgr.grabPixels();
        } catch (InterruptedException ex) {
            ex.getStackTrace();
        }
        int pixels[] = (int[]) pgr.getPixels();

        // 循环像素
        for (int i = 0; i < pixels.length; i++) {
            // 筛选,将不透明的像素的坐标加入到坐标ArrayList x和y中
            int alpha = getAlpha(pixels[i]);
            if (alpha == 0) {
                continue;
            } else {
                x.add(i % width > 0 ? i % width - 1 : 0);
                y.add(i % width == 0 ? (i == 0 ? 0 : i / width - 1) : i / width);
            }
        }

        // 建立图像矩阵并初始化(0为透明,1为不透明)
        int[][] matrix = new int[height][width];
        for (int i = 0; i < height; i++) {
            for (int j = 0; j < width; j++) {
                matrix[i][j] = 0;
            }
        }

        // 导入坐标ArrayList中的不透明坐标信息
        for (int c = 0; c < x.size(); c++) {
            matrix[y.get(c)][x.get(c)] = 1;
        }

        /*
         * 由于Area类所表示区域可以进行合并,我们逐一水平"扫描"图像矩阵的每一行,
         * 将不透明的像素生成为Rectangle,再将每一行的Rectangle通过Area类的rec
         * 对象进行合并,最后形成一个完整的Shape图形
         */
        Area rec = new Area();
        int temp = 0;

        for (int i = 0; i < height; i++) {
            for (int j = 0; j < width; j++) {
                if (matrix[i][j] == 1) {
                    if (temp == 0)
                        temp = j;
                    else if (j == width) {
                        if (temp == 0) {
                            Rectangle rectemp = new Rectangle(j, i, 1, 1);
                            rec.add(new Area(rectemp));
                        } else {
                            Rectangle rectemp = new Rectangle(temp, i,
                                    j - temp, 1);
                            rec.add(new Area(rectemp));
                            temp = 0;
                        }
                    }
                } else {
                    if (temp != 0) {
                        Rectangle rectemp = new Rectangle(temp, i, j - temp, 1);
                        rec.add(new Area(rectemp));
                        temp = 0;
                    }
                }
            }
            temp = 0;
        }
        return rec;
    }

    /**
     * 取得透明度
     * @param pixel
     * @return
     */
    private int getAlpha(int pixel) {
        return (pixel >> 24) & 0xff;
    }

    /**
     * 事件监听
     * @author Admin
     *
     */
    private class OwnListener extends MouseAdapter {
        public void mousePressed(MouseEvent e) {
            origin.x = e.getX();
            origin.y = e.getY();
        }

        // 窗体上单击鼠标右键关闭程序
        public void mouseClicked(MouseEvent e) {
            //如果点击的区域位于右上角红色按钮,则关闭程序
            if (new Circle(350, 63, 11).contants(e.getX(), e.getY())) {
                System.exit(0);
            } else if (e.getSource() == okbtn) {
                //验证用户是否合法,合法打开主程序
            } else if (e.getSource() == resert) {
                userText.setText("");
                passwordText.setText("");
            } else if (e.getSource() == register) {
                //打开注册页面
            }
        }

        public void mouseReleased(MouseEvent e) {
            super.mouseReleased(e);
        }
    }

    /**
     * 监听键盘Enter键,实现Enter登录
     * @author Admin
     *
     */
    private class KeyOwnListener extends KeyAdapter {
        public void keyPressed(KeyEvent e) {
            if (10 == e.getKeyCode()) {
                //验证用户是否合法,合法打开主程序
            }
        }
    }
}

以上是关于Java Swing 怎么自定义界面背景图片的主要内容,如果未能解决你的问题,请参考以下文章

java中swing界面上怎么给jpanel上添加背景图片

java swing 我是想把图片作为登录界面的背景,并且需要背景图片能够随窗口大小缩放。。。最好是用标签法

求在java中添加背景音乐的代码

如何在swing里面设置背景图片???

Eclipse中jframe怎么用属性设背景图片

JAVA图形界面,怎么让背景图片正好充满JFrame?