前段时间在用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); } }
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层中。这样就大功告成啦。
正宗地产的好茶叶,如果你竟然喜欢喝茶,一定要去看看:http://tea0760.taobao.com
更多精彩有技术分享请访问:http://www.heyswan.com