实现思路
Swing中给窗体设置背景大概有如下两种思路:
1、绝对布局或其他少数可以进行组件覆盖叠加的布局下,使用JLabel作为窗体的最底层,给其设置背景图;
2、定义一个JPanel的子类,重写其paintComponent方法,其中进行背景图的绘制。
资源准备
创建Java项目,其中创建一个“Source Folder”,并创建一个包“images”用来存放图片资源:
使用JLabel实现
通过插件WindowBuilder,创建一个JFrame,并设置其contentPane为绝对布局,然后在其上放置组件等,最后放置JLabel并置于底层(在结构树中最下的位置):
然后设置lblBg的背景图:
关于背景拉伸
如果要实现背景图的自动拉伸,可以定义ImageIcon的子类,重写其paintIcon方法,使其根据JLabel大小自动缩放。网上代码很多,此处不详细展开。
另外,若使用了绝对布局,若要想实现背景随窗口变化而自动拉伸,一般可以通过监听窗口的尺寸改变事件,当窗口尺寸改变时,同时修改JLabel尺寸。
使用JPanel子类实现(推荐)
定义一个JPanel的子类,并重写其paintComponent方法。
注意,重写这个方法有两种流行套路,其中一种是使用Graphics2D类的scale缩放,而这种缩放会影响该JPanel上的其他组件,会连带进行缩放,不推荐使用;另一种套路则是直接绘制当前背景图,使用drawImage方法进行缩放控制,代码如下:
public class BgPanel extends JPanel {
private ImageIcon imageIcon = null;
/**
* Create the panel.
*/
public BgPanel(URL imgUrl) {
super();
imageIcon = new ImageIcon(imgUrl);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (imageIcon != null) {
g.drawImage(imageIcon.getImage(), 0, 0, getWidth(), getHeight(), 0, 0, imageIcon.getIconWidth(), imageIcon.getIconHeight(), null);
}
}
}
之后,再替换JFrame中的构造背景面板的代码:
public MainFrm2() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 487, 336);
//contentPane = new JPanel(); 替换掉这里的构造
contentPane = new BgPanel(MainFrm2.class.getResource("/images/bg.jpg"));
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
// ...
}
这种方式干净简洁,推荐使用。实现效果: