为了给JFrame放置背景图片可以使用JLayeredPane,这是一个分层的面板,它一共分了七层,我们在这里只需要使用其中的两层就可以实现放置背景图片,下面一层放背景图片,上面一层放控件,另外需要注意的是,使用了JLayeredPane之后只能使用控件的setBounds()方法来设置大小和位置,如果不设置的话,将不会显示出来加进去的控件,代码如下:
LayeredFrame.java
package swing;
import java.awt.BorderLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class LayeredFrame extends JFrame{
/**
* 分层panel
*/
private JLayeredPane layeredPane;
/**
* 放置背景图片的panel
* 放置在下层
*/
private JPanel backPane;
/**
* 组件放置在上层
*/
private JButton button;
/**
* 组件放置在上层
*/
private JTextField text;
/**
* 放置内容的面板
*/
private JPanel componentPane;
/**
* 放置图片的label
*/
private JLabel labelImage;
public LayeredFrame() {
// 获取图片
ImageIcon imageIcon= new ImageIcon("resource\\swing.png");
layeredPane = new JLayeredPane();
//设置JFrame的JLayeredPane
this.setLayeredPane(layeredPane);
labelImage = new JLabel(imageIcon);
backPane = new JPanel();
backPane.add(labelImage);
//将内容面板加入JLayeredPane最下层
layeredPane.add(backPane, JLayeredPane.DEFAULT_LAYER);
//JLayeredPane中只能使用setBounds放置设置位置,没有LayoutManager
backPane.setBounds(0, 0, imageIcon.getIconWidth(), imageIcon.getIconHeight());
labelImage.setBounds(0, 0, imageIcon.getIconWidth(), imageIcon.getIconHeight());
componentPane = new JPanel();
//为componentpanel设置布局管理器
componentPane.setLayout(new BorderLayout());
//将componentPanel加入JLayeredPane中上面一层
layeredPane.add(componentPane, JLayeredPane.MODAL_LAYER);
//使用setBounds为componentPane设置位置和大小
componentPane.setBounds(20, 20, 300, 100);
text = new JTextField();
componentPane.add(text, BorderLayout.NORTH);
button = new JButton("text");
componentPane.add(button, BorderLayout.SOUTH);
//setOpaque()方法设置为false,那么没有添加组件的地方将不会绘制出来
//会显示下面一层的内容
componentPane.setOpaque(false);
this.setSize(imageIcon.getIconWidth(), imageIcon.getIconHeight());
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main(String[] args) {
new LayeredFrame();
}
}
效果如下: