首先还是要了解框架JFrame中的层次结构。JFrame中的层次分布及相对关系是:最底层是:JRootPane;第二层是:JlayerPane;最上层就是ContentPane,也正是我们常说的内容面板。所以一般我们拖放的控件就是在ContentPane层上。有了这些常识后我们就可以随意设计背景了。在这里笔者提供两种方法为一个frame设置一张背景图片方法一:
原理:我们把图片放置在第二层:JlayerPane容器上,然后让最上层的:ContentPane透明,这样就实现了背景的设置。(当然把图片放置最低层,让上面两层透明也是可以的) 代码如下:package NewPackage;
import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Demo2 {
public static void main(String[] args) {
JFrame f1=new JFrame("插入背景图像");
f1.setBounds(400, 200, 500, 300);
f1.setVisible(true);
f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ImageIcon img=new ImageIcon("D:\\cat.png");
JLabel bg=new JLabel(img);
f1.getLayeredPane().add(bg, new Integer(Integer.MIN_VALUE));
bg.setBounds(0, 0, img.getIconWidth(), img.getIconHeight());
JPanel jp= (JPanel)f1.getContentPane();//强制类型转换
//Container contain = f1.getContentPane();
//((JPanel) contain).setOpaque(false); //
jp.setOpaque(false);
jp.setLayout(new FlowLayout());
//contain.setLayout(new FlowLayout());
//contain.add(bg);
jp.add(bg);
}
}
方法二:
原理:我们直接在最上层容器内重写paintComponent(Graphics g)方法在容器中画一张图片。(这种方法很直观,原理很简单)。代码如下:package NewPackage;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Demo3 extends JFrame{
//创建一个容器
JPanel jp;
//创建背景面板。
BackgroundPanel bgp;
//创建一个按钮,用来证明我们的确是创建了背景图片,而不是一张图片。
JButton jb;
public static void main(String[] args){
new Demo3();
}
public Demo3(){
//不采用任何布局方式。
jp=(JPanel)this.getContentPane();
this.setLayout(null);
//在这里随便找一张400*300的照片既可以看到测试结果。
ImageIcon img=new ImageIcon("D:\\cat.png");
bgp=new BackgroundPanel(img.getImage());
bgp.setBounds(0,0,img.getIconWidth(),img.getIconHeight());
//创建按钮
jb=new JButton("测试按钮");bgp.add(jb);jp.add(bgp);
this.setBounds(400, 200, 500, 300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
class BackgroundPanel extends JPanel{
Image im;
public BackgroundPanel(Image im){
this.im=im;
this.setOpaque(true);
}
//Draw the back ground.
public void paintComponent(Graphics g){
super.paintComponents(g);
g.drawImage(im,0,0,this.getWidth(),this.getHeight(),this);
}
}
程序运行效果如下: