程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java swing如何添加背景圖片並能根據窗口大小進行縮放

java swing如何添加背景圖片並能根據窗口大小進行縮放

編輯:關於JAVA

前段時間在用JAVA SWING做個客戶端的時候,有要在一塊主面板上添加背景圖片的需求,於是自己在網上找了些資料研究一下,有些網友說用JLabel來做,通過設置它的icon屬性來實現,但個人感覺這種做法很HACK,呵呵,而且這種方法容易帶來在上面的內容被遮住等等的問題,所以個人更喜歡用一個繼承JPanel的類來實現的方法,其實我感覺它跟Web中的層的概念有幾分相似吧,只需要把這個“層”加到面板的最下面,作為墊底的,就OK了,來看看怎樣實現它:

import javax.swing.JPanel;  
import java.awt.Graphics;  
import java.awt.Graphics2D;  
import java.awt.Toolkit;  
import java.awt.Image;  
/** 
 * 圖片面板,窗體需要加背景圖片時用 
 * @author [email protected] 
 */
public class CustomImgPanel extends JPanel{  
    private int width = 0;  
    private int height = 0;  
    private String imgPath = "";  
    /** 
     * 
     * @param _width 整型,窗口的寬度 
     * @param _height 整型,窗口的高度 
     * @param _imgPath 圖片的URL,可用相對路徑 
     */
    public CustomImgPanel(int _width,int _height,String _imgPath){  
        width = _width;  
        height = _height;  
        imgPath = _imgPath;  
        setSize(width,height);  
        setVisible(true);  
    }  
    /** 
     * 
     * @param _width 浮點型,窗口的寬度 
     * @param _height 浮點型,窗口的高度 
     * @param _imgPath  字符串,圖片的URL,可用相對 
     */
    public CustomImgPanel(double _width,double _height,String _imgPath){  
        width = (int)_width;  
        height = (int)_height;  
        imgPath = _imgPath;  
        setSize(width,height);  
        setVisible(true);  
    }  
      
    @Override
    public void paintComponent(Graphics gs) {  
        Graphics2D g = (Graphics2D) gs;  
        super.paintComponent(g);  
        //畫背景圖片  
        Image image = Toolkit.getDefaultToolkit().getImage(getClass().getResource(imgPath));  
        g.drawImage(image, 0, 0,width,height, this);  
    }  
}

上面是定義CustomImgPanel這個類的代碼,下面看怎樣使用它:

double panelWidth = Toolkit.getDefaultToolkit().getScreenSize().getWidth();  
double panelHeight = Toolkit.getDefaultToolkit().getScreenSize().getHeight() - 25 - 25 - 20;//(兩個25是內外兩個窗口標題欄的高度,20是底部更新進度欄的高度)  
imgPanel = new CustomImgPanel(panelWidth,panelHeight,"../form/images/mainBg.jpg");  
this.mainPanel.add(imgPanel,-1);//參數-1的作用是讓這個背景圖片面板保持在所有面板的最下面,相當於WEB中的z-index屬性

查看本欄目

由於 我的窗口默認情況是最大化的,所以我取的高度和寬度是屏幕的高度和寬度,這個大家根據自己的情況來調整咯,好了,初始化的時候設好了,那當用戶改變窗口的大小的時候如果圖片大小不改變的話會很難看,這會導致老板的臉色也很難看,呵呵,所以需要監聽一個父窗口的大小變化,並根據情況來調整圖片的大小,這樣才顯得比較智能,嘿嘿,有代碼有真相:

/** 
     * 監聽最外層窗口的resize事件,並根據新的窗口大小來調整背景圖片的尺寸 
     * @param evt 
     */
    private void formComponentResized(java.awt.event.ComponentEvent evt) {                                        
        // TODO add your handling code here:  
        try{  
            this.mainPanel.remove(imgPanel);  
        }catch(Exception e){  
        }  
        imgPanel = null;  
        Dimension newSize = evt.getComponent().getSize();  
        imgPanel = new CustomImgPanel(newSize.getWidth(),newSize.getHeight()-70,"../form/images/mainBg.jpg");  
        this.mainPanel.add(imgPanel,-1);  
    }

這個是外層JFrame的監聽方法,當改變大小事件觸發時,為了避免背景面板重疊或其它不必要的異常情況發生,所以先調用remove方法移除,再設為null清空一次,最後再重新生成並加到-1層中。這樣就大功告成啦。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved