在美化程序時,常常需要在窗體上添加背景圖片。通過搜索和測試,發現了2種有效方式。下面分別介紹。
1.利用JLabel加載圖片
利用JLabel自帶的setIcon(Icon icon)加載icon,並設置JLabel對象的位置和大小使其完全覆蓋窗體。這是一個很取巧的辦法,代碼非常簡單,如下所示。
JLabel lbBg = new JLabel(imageIcon); lbBg.setBounds(0, 0, frameSize.width, frameSize.height); this.getContentPane().add(lbBg);
然而這種方法有幾個要注意的點:
(1)不能使用布局管理器
此時你需要將布局管理器設置為null,然后精確控制所有控件的大小和位置。否則,JLabel無法完整覆蓋窗體。
(2)應當先添加背景JLabel,再添加其它控件。否則其它控件將被JLabel所遮擋(為什么不是后添加的遮擋先添加的?)。
(3)由於控件及窗體的尺寸需要手動控制,因此無法對背景圖片進行縮放。
2.重載JPanel的paintComponent(Graphics g)方法
通過重載該方法,在JPanel的繪制階段將指定圖片繪制上去即可。由於背景是繪制出來的,因此不會對布局有任何影響。
示例代碼如下:
@Override public void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(image, 0, 0, d.width, d.height, this); MainFrame.instance().repaint(); }
下面是一個完整的demo。
package frame; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; public class ImageFrame extends JFrame { class ImagePanel extends JPanel { Dimension d; Image image; public ImagePanel(Dimension d, Image image) { super(); this.d = d; this.image = image; } @Override public void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(image, 0, 0, d.width, d.height, this); MainFrame.instance().repaint(); } } Dimension frameSize = new Dimension(500, 300); ImageIcon imageIcon = new ImageIcon(this.getClass().getResource( "/images/bg.jpg")); public ImageFrame() { // 設置窗體屬性 setSize(frameSize); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setIconImage(imageIcon.getImage()); setUndecorated(true); } public void addImageByJLable() { setLayout(null); // 設置背景 JLabel lbBg = new JLabel(imageIcon); lbBg.setBounds(0, 0, frameSize.width, frameSize.height); this.getContentPane().add(lbBg); addComponents(); setVisible(true); } public void addImageByRepaint() { ImagePanel imagePanel = new ImagePanel(frameSize, imageIcon.getImage()); setContentPane(imagePanel); addComponents(); setVisible(true); } private void addComponents() { JButton btn1 = new JButton("haha"); btn1.setBounds(10, 20, 60, 30); this.getContentPane().add(btn1); JTextField jtf = new JTextField("22222222222"); jtf.setBounds(200, 100, 80, 30); this.getContentPane().add(jtf); } public static void main(String[] args) { // TODO Auto-generated method stub ImageFrame imageFrame = new ImageFrame(); // imageFrame.addImageByJLable(); imageFrame.addImageByRepaint(); } }
運行效果如下:

圖1 使用JLabel加載圖片效果
圖1可見,使用JLabel時,由於未圖片尺寸與窗體尺寸不一致,導致圖片只顯示出一部分;且有一個控件被遮擋了。注意:通過精細設置尺寸和添加控件順序,可以達到較為滿意的效果的。

圖2 使用重繪方式加載圖片
圖2可見,不需要可以設置匹配尺寸和控件的添加順序,即可得到比較滿意的效果。
