首先要了解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对象,否则图像无法显示在画布上。