为jframe窗口设置背景图片

终于成功实现了如何为jframe窗口设置背景图片了。下面是示例,请初学swring的朋友们参考学习!
java

import java.awt.FlowLayout;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class JFrameBackground {

 private JFrame frame = new JFrame("背景图片测试");

 private JPanel imagePanel;

 private ImageIcon background;

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

 public JFrameBackground() {
  background = new ImageIcon("003.jpg");// 背景图片
  JLabel label = new JLabel(background);// 把背景图片显示在一个标签里面
  // 把标签的大小位置设置为图片恰好填充整个面板
  label.setBounds(0, 0, background.getIconWidth(),
    background.getIconHeight());
  // 把内容窗格转化为JPanel,不然不能用方法setOpaque()来使内容窗格透明
  imagePanel = (JPanel) frame.getContentPane();
  imagePanel.setOpaque(false);
  // 内容窗格默认的布局管理器为BorderLayout
  imagePanel.setLayout(new FlowLayout());
  imagePanel.add(new JButton("测试按钮"));

  frame.getLayeredPane().setLayout(null);
  // 把背景图片添加到分层窗格的最底层做为背景
  frame.getLayeredPane().add(label, new Integer(Integer.MIN_VALUE));
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.setSize(background.getIconWidth(), background.getIconHeight());
  frame.setResizable(false);
  frame.setVisible(true);
 }
}

public static void main (String[] args) {       
JFrame frame=new JFrame("背景图设置");        
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);       
ImageIcon img = new ImageIcon("bg\\1.gif");//这是背景图片   
JLabel imgLabel = new JLabel(img);//将背景图放在标签里。      
frame.getLayeredPane().add(imgLabel, new Integer(Integer.MIN_VALUE));//注意这里是关键,将背景标签添加到jfram的LayeredPane面板里。    
imgLabel.setBounds(0,0,img.getIconWidth(), img.getIconHeight());//设置背景标签的位置   
Container cp=frame.getContentPane();   
cp.setLayout(new BorderLayout());    
JButton but=new JButton("anniu");//建立按钮  
cp.add(but,"North");//将按钮添加入窗口的内容面板      
((JPanel)cp).setOpaque(false); //注意这里,将内容面板设为透明。这样LayeredPane面板中的背景才能显示出来。      
frame.setSize(500,300);   frame.setVisible(true);                    
}     


经过为jframe设置背景图片,让我明白了如下的知识要点:  
(1)jframe窗口的组成部分,最底层是jrootpane面板。(这一点恐怕不少初学者都没有注意吧!)  
(2)jframe的组成以下:  jrootpane中包含glasspane和layeredpane两个面板。而layeredpane面板包含contentpane和jmenubar。(没想到吧contentpane是放在contentpane中的?)                            
(3)在jframe上添加组件,每每是添加在contentpane中。。可是在contentpane的下面还有两层面板,那就是layeredpane和jrootpane。  

(4)任何一本关于java的书中都会介绍contentpane,却不多提到layeredpane和jrootpane,所以使得不少的初学者产生:jframe中只要一个contentpane的错误认识。 经过解决背景设置的问题,让我对jframe中容器的“层”结构,函数


更多参考:布局


  从网上搜索了有关设置背景图片的文章,可是由于我每次设计窗口程序的时候,喜欢利用“Degsin”按钮,将全部的窗口进行布局后,在进行相关源代码的填写,所以,网页提供的答案是直接在主函数中编写,而我选择了在构造函数中编写,故有必定的不一样。相关代码以下:学习

主函数:测试

public static void main(String[] args) {
  EventQueue.invokeLater(new Runnable() {
   public void run() {
    try {
     HAPPY frame = new HAPPY();
     //frame.setVisible(true);      这行代码,可加可不加,并不会影响最终结果,可是在构造函数中必定要添加;
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
  });
 }spa

构造函数(关键代码):设计

JFrame frame=new JFrame("\设\置\背\景\图\片 ");   
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
     ImageIcon img = new ImageIcon("src/images/1.jpg");//这是背景图片   
     JLabel imgLabel = new JLabel(img);//将背景图放在标签里。   
   
     frame.getLayeredPane().add(imgLabel, new Integer(Integer.MIN_VALUE));//注意这里是关键,将背景标签添加到jfram的     LayeredPane面板里。   
     imgLabel.setBounds(0,0,img.getIconWidth(), img.getIconHeight());//设置背景标签的位置   
     Container cp=frame.getContentPane();   
     cp.setLayout(null);      //这里选择绝对布局管理器,对于边界布局管理器,放入控件后,没法显示背景图片;由于将整个面板都填充满了;
     ((JPanel)cp).setOpaque(false); //这样就能显示出背景图片出来了。code

剩下的就是在面板中添加相关的控件,添加语句能够用:图片

(1)frame.getContentPane().add(panel);        (2)cp.add(panel)            get

效果同样;


另外一种方法则是直接为面板设置背景图片,源代码以下:

contentPane = new JPanel(){
   private static final long serialVersionUID=-1588458291133087637L;
   public void paint(Graphics g){
    ImageIcon icon=new ImageIcon("src/images/5.jpg");
    Image image=icon.getImage();
    g.drawImage(image, 0, 0, null);
   }
  };

但在实验中发现,显示效果不如前一种方法,不知为什么,面板上设置的标签文字显示不出来,因此,后一种方法虽然更简便,但彷佛前一种方法效果更好!

第三种方法:

contentPane.setOpaque(false);

JLabel backgroundLabel = new JLabel("");
        ImageIcon background = new ImageIcon(BalloonMove.class.getResource("/images/background.jpg"));
        backgroundLabel.setBounds(0, 0, background.getIconWidth(),background.getIconHeight());
        backgroundLabel.setIcon(background);
        getLayeredPane().add(backgroundLabel, new Integer(Integer.MIN_VALUE));

窗口中的标签,能够直接添加到contentPane面板中,很显然,最后一种方法显示效果很好,且代码简便。