swing-窗體添加背景圖片的2種方法

在美化程序時,經常須要在窗體上添加背景圖片。經過搜索和測試,發現了2種有效方式。下面分別介紹。
1.利用JLabel加載圖片
利用JLabel自帶的setIcon(Icon icon)加載icon,並設置JLabel對象的位置和大小使其徹底覆蓋窗體。這是一個很取巧的辦法,代碼很是簡單,以下所示。java

JLabel lbBg = new JLabel(imageIcon);
lbBg.setBounds(0, 0, frameSize.width, frameSize.height);
this.getContentPane().add(lbBg);

 

然而這種方法有幾個要注意的點:
(1)不能使用佈局管理器
此時你須要將佈局管理器設置爲null,而後精確控制全部控件的大小和位置。不然,JLabel沒法完整覆蓋窗體。
(2)應當先添加背景JLabel,再添加其它控件。不然其它控件將被JLabel所遮擋(爲何不是後添加的遮擋先添加的?)。
(3)因爲控件及窗體的尺寸須要手動控制,所以沒法對背景圖片進行縮放。ide

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();
    }

}

運行效果以下:this

圖1 使用JLabel加載圖片效果spa

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

 

圖2 使用重繪方式加載圖片對象

圖2可見,不須要能夠設置匹配尺寸和控件的添加順序,便可獲得比較滿意的效果。blog

相關文章
相關標籤/搜索