首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java swing 怎样添加背景图片并且能根据窗口大小进行缩放

java swing 怎样添加背景图片并且能根据窗口大小进行缩放

作者头像
风柏杨4711
发布2021-03-15 10:49:38
1.4K0
发布2021-03-15 10:49:38
举报
文章被收录于专栏:技术小牛技术小牛技术小牛

前段时间在用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层中。这样就大功告成啦。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2011-07-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档