前段时间在用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 waitatlee@163.com
*/
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层中。这样就大功告成啦。
