java程序图片加载小结

本文介绍五种在Java Swing中为JFrame设置背景图片的方法,包括利用JLayeredPane、重写paint方法、使用BufferedImage等,并提供完整代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先要了解JFrame的层次结构。JFrame中的层次分布及相对关系是:最底层是:JRootPane,第二层是:JLayerPane,顶层是:ContentPane,也就是我们常说的内容面板。所以一般我们拖放的控件就是在ContentPane层上。
方法一:

我们把图片放置在第二层:JLayerPane容器上,然后让最上层的:ContentPane透明,这样就实现了背景的设置。(当然把图片放置最底层,让上面两层透明也可以)

package za;
import java.awt.BorderLayout;
import javax.swing.*;

public class Image extends JFrame{
	
	private static final long serialVersionUID = 1L;
	public Image()
	{
		ImageIcon bg=new ImageIcon("D:\\a.jpg");
		JLabel label=new JLabel(bg);
		label.setBounds(0, 0, bg.getIconWidth(), bg.getIconHeight());
		this.getLayeredPane().add(label,new Integer(Integer.MIN_VALUE));
		JPanel jp=(JPanel)this.getContentPane();
		jp.setOpaque(false);
		JPanel panel=new JPanel();
		panel.setOpaque(false);		
		JButton button=new JButton("OK");
		panel.add(button);
		this.add(panel,BorderLayout.SOUTH);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setSize(bg.getIconWidth(), bg.getIconHeight());
		this.setVisible(true);		
	}
	public static void main(String args[])
	{
		new Image();
	}
}

方法二:

直接在内容面板上重写paint(Graphics g)方法,在容器中画一张图片。

package za;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.*;

class PanelTest extends JPanel
{
	private static final long serialVersionUID = 1L;	
	Image im=Toolkit.getDefaultToolkit().getImage("D:\\a.jpg");
	public void paint(Graphics g)
	{
	//	super.paint(g);
		g.drawImage(im, 0, 0, this);
	}
}
public class Myimage extends JFrame{
	
	private static final long serialVersionUID = 1L;
	public Myimage()
	{
		PanelTest pan=new PanelTest();	
		this.add(pan);
		this.setContentPane(pan);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	
		this.setSize(500, 500);
		this.setVisible(true);
	}
	public static void main(String args[])
	{
		new Myimage();
	}
}

方法三:

重写paintComponent(Graphics g)

package za;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;

import javax.swing.*;

class MyFrame extends JFrame
{	
	private static final long serialVersionUID = 1L;
	private static final int WIDTH=300;
	private static final int HEIGHT=200;
	
	public MyFrame()
	{
		this.setSize(WIDTH, HEIGHT);
		MyPanel pan=new MyPanel();
		Container contentPane=getContentPane();
		contentPane.add(pan);
	}
	class MyPanel extends JPanel
	{
		private static final long serialVersionUID = 1L;		
		Image im;
		public MyPanel()
		{
			im=Toolkit.getDefaultToolkit().getImage("D:\\a.jpg");
		}
		public void paintComponent(Graphics g)
		{
			super.paintComponent(g);
		/*	int imWidth=im.getWidth(null);
			int imHeight=im.getHeight(null);*/
			int imWidth=im.getWidth(this);    //获得图像的宽高
			int imHeight=im.getHeight(this);
			int PWidth=this.getWidth();       //获得面板的宽高
			int PHeight=this.getHeight();
			int x=(PWidth-imWidth)/2;        //将图像放在面板中央
			int y=(PHeight-imHeight)/2;	
			g.drawImage(im, x, y, null);
		//	g.drawImage(im, x, y, this);
		}
	}
}
public class Myimage{
	
	public static void main(String args[])
	{
		MyFrame f=new MyFrame();
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setVisible(true);
	}
}

运行结果:秀一下美女照片大笑


方法四:

package za;

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

public class TestLoadImage{
    public static void main(String[] args){
        JFrame f=new JFrame();
        MyCanvas mc=new MyCanvas();
        Image image=Toolkit.getDefaultToolkit().getImage("D:\\a.jpg");
        mc.setImage(image);
        f.add(mc);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(400,550);
        f.setVisible(true);
    }
}

class MyCanvas extends Canvas {    
	private static final long serialVersionUID = 1L;
	private Image in; 
    public void setImage(Image in){
        this.in=in;
    }
    public void paint(Graphics g){
        g.drawImage(in,0,0,this.getWidth(),this.getHeight(),this);
    }    
}

方法5:

package za;

import java.awt.*;
import java.awt.image.*;
import javax.swing.JFrame;
import java.io.*;
import javax.imageio.*;

public class TestBufferedImage extends Canvas{    
  
	private static final long serialVersionUID = 1L;

	public static void main(String[] args){
        JFrame f=new JFrame();
        MyCanvas mc=new MyCanvas();
        f.add(mc);
        try{
            File file=new File("D:\\a.jpg");
            BufferedImage bi=ImageIO.read(file);
            mc.setImage(bi);
        }catch(Exception e){
            e.printStackTrace();
        }
        mc.repaint();
        f.setSize(400,550);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }
}

class MyCanvas extends Canvas{    
	private static final long serialVersionUID = 1L;
	private BufferedImage bi;
    private Image im;
    private int image_width;
    private int image_height;
    
    public void setImage(BufferedImage bi){
        this.bi=bi;
        this.zoom();
    }
    
    public void paint(Graphics g){
        g.drawImage(im,0,0,this.getWidth(),this.getHeight(),this);
    }
    
    public void zoom(){
        image_width=bi.getWidth();
        image_height=bi.getHeight();
        im=bi.getScaledInstance(image_width,image_height,Image.SCALE_SMOOTH);
    }
}

以上两种方法都会遇到一个问题,就是随着窗口改变,图片大小固定不变,要想实现图片随窗口大小改变,只需要

g.drawImage(im,0,0,this.getWidth(),this.getHeight(),this);

 在使用BufferedImage加载图片时需要调用其getScaledInstance()方法创建一个新Image对象,否则图像无法显示在画布上。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值